java線程應用
A. java多線程有哪些實際的應用場景
場景一:一個業務邏輯有很多次的循環,每次循環之間沒有影響,比如驗證1萬條url路徑是否存在,正常情況要循環1萬次,逐個去驗證每一條URL,這樣效率會很低,假設驗證一條需要1分鍾,總共就需要1萬分鍾,有點恐怖。這時可以用多線程,將1萬條URL分成50等份,開50個線程,沒個線程只需驗證200條,這樣所有的線程執行完是遠小於1萬分鍾的。
場景二:需要知道一個任務的執行進度,比如我們常看到的進度條,實現方式可以是在任務中加入一個整型屬性變數(這樣不同方法可以共享),任務執行一定程度就給變數值加1,另外開一個線程按時間間隔不斷去訪問這個變數,並反饋給用戶。
總之使用多線程就是為了充分利用cpu的資源,提高程序執行效率,當你發現一個業務邏輯執行效率特別低,耗時特別長,就可以考慮使用多線程。不過CPU執行哪個線程的時間和順序是不確定的,即使設置了線程的優先順序,因此使用多線程的風險也是比較大的,會出現很多預料不到的問題,一定要多熟悉概念,多構造不同的場景去測試才能夠掌握!
我有一個微信公眾號,每天都會分享一些Java相關的干貨文章,還有一些學習資源。
如果你喜歡我的分享,可以用微信搜索「Java團長」或者「javatuanzhang」關注。
B. java線程的用處
一、為什麼要研究和使用線程一般來說,計算機正在執行的程序稱作進程(process),進程有不同的地址空間並且是在同一系統上運行的不同程序,如WORD和Excel,進程間的通訊是很費時而且有限的。上下文切換、改變運行的進程也是非常復雜的。進程間通訊復雜,可能需要管道、消息隊列、共享內存(sharedmemory)或信號處理來保證進程間的通訊。盡管許多程序都在運行,但一次只能與一個程序打交道。線程(thread)是指進程中單一順序的控制流。又稱為輕量級進程。線程則共享相同的地址空間並共同構成一個大的進程。線程間的通訊是非常簡單而有效的,上下文切換非常快並且是整個大程序的一部分切換。線程僅是過程調用,它們彼此獨立執行,線程使得在一個應用程序中,程序的編寫更加自由和豐富。線程的興趣在於,一個程序中同時使用多個線程來完成不同的任務。因此如果很好地利用線程,可以大大簡化應用程序設計。多線程可以增進程序的交互性,提供更好的能力和功能、更好的GUI和更好的伺服器功能。給二個例子說明如下:例一:利用多線程並行機制可以很好地解決互動式網路程序中的許多問題,如:大量的網路文件資源的讀寫、用戶輸入響應、動畫顯示等問題不需要CPU的多少時間;而耗時的復雜計算通常並不需要立即響應,所以無需將CPU全給它。例如,從一個慢速的網路上讀取一數據流也許要1分鍾時間,但需要CPU參與傳輸數據的時間則非常短;響應用戶的輸入如擊鍵,就算最快的輸入員,1秒鍾擊鍵10次,也不需要CPU的多少時間。動畫程序比較耗時,一幅畫在1秒內要重繪5-10次,但CPU在大部分時間仍處於空閑狀態。在傳統的單線程環境下的問題是用戶必須等待每個任務完成後才能進行下一個任務。即使CPU大部分時間空閑,也只能按步就班地工作。多線程可以很好地解決這些問題避免引起用戶的等待。如:耗時的復雜計算應用就可劃分成兩個控制線程:一個處理GUI的用戶事件,另一個進行後台計算。例二:如並發伺服器,它面向不定長時間內處理完的請求,對每個請求由伺服器的線程處理。傳統的並發伺服器往往是基於多進程機制的,每個客戶一個進程,需要操作系統的干預,進程的數目受操作系統的限制。本文利用Java的線程機制建立了基於多線程的並發伺服器。生成和管理他們是相當簡單的操作。線程被用來建立請求驅動的服務程序,每個客戶一個線程,多個線程可以並發執行。特別地線程具有如下特性(1)線程共享父進程的所有程序和數據(2)有自身的運行單元(3)有它自己的私有存儲和執行環境(尤其是處理器寄存器),使得伺服器進程不隨客戶數的增加而線性增加。可減少伺服器進程的壓力,降低開銷,充分利用CPU的資源。以上並發伺服器在某一瞬間由同一伺服器進程所產生的多個並發線程對多個客戶的並發請求採取分而治之的措施,從而解決了並發請求的問題。各線程即可以獨立操作,又可以協同作業。降低了伺服器的復雜度。Java是基於操作系統級的多線程環境之上設計的,Java的運行器依靠多線程來執行任務,並且所有類庫在設計時都考慮到多線程機制。二、線程的應用在實際應用中,線程使用的范圍很廣,可用於控制實時數據處理、快速的網路服務,還有更快的圖象繪制和列印,以及資料庫中的數據的取回和處理等等。在Java中一個在不停運行的提供一些基本服務的例子是垃圾收集線程,垃圾收集線程,。該線程由Java虛擬機提供。它掃描程序中不再被訪問的變數,將其所佔的系統資源釋放給系統。參考資料: http://hi..com/%B1%CF%C0%F6%C3%F4/blog/item/7af6954be4afacf283025c10.html
C. 線程在java編程中的作用
線程在java編程中的作用可以實現多個任務同時進行。java創建線程的方式最常用的有兩種。
1、第一種是創建Thread子類的一個實例並重寫run方法,run方法會在調用start()方法之後被執行。例子如下:
{
publicvoidrun(){
System.out.println("MyThreadrunning");
}
}
MyThreadmyThread=newMyThread();
myTread.start();
2、第二種編寫線程執行代碼的方式是新建一個實現了java.lang.Runnable介面的類的實例,實例中的方法可以被線程調用。下面給出例子:
{
publicvoidrun(){
System.out.println("MyRunnablerunning");
}
}
Threadthread=newThread(newMyRunnable());
thread.start();
D. 在用java開發程序中什麼時候應用到線程
一般 需要獨立運行某個東西的時候會用到線程
我用過的就是 埠監聽的時候
比如說 你的程序在200埠上 設置另一個監聽,當有數據通過這個埠傳輸的時候 就會被監聽程序所獲取 但是如何保證 實時監聽?這個就需要有個線程獨立的 來執行這個工作 保持監聽的狀態。
再比如說 你需要做一個任務處理的程序 當資料庫中有新任務時候就進行處理/或者XX路徑下出現新的文件 就進行處理,這個時候 也需要用到線程 來實時掃描資料庫或者是文件路徑,來保證任務能夠得到及時的處理
E. Java線程怎樣使用
多進程是指操作系統能同時運行多個任務(程序),多線程是指在同一程序中有多個順序流在執行。
在java中創建一個線程有兩種方法:
packagecom.thread;
publicclassThreadTest1{
publicstaticvoidmain(String[]args){
Runnable1r=newRunnable1();
//r.run();並不是線程開啟,而是簡單的方法調用
Threadt=newThread(r);//創建線程
//t.run();//如果該線程是使用獨立的Runnable運行對象構造的,則調用該Runnable對象的run方法;否則,該方法不執行任何操作並返回。
t.start();//線程開啟
for(inti=0;i<100;i++){
System.out.println("main:"+i);
}
}
}
{
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("Thread-----:"+i);
}
}
}
F. java多線程的應用
你的問題是因為線程分配的不確定性,及你的設計思路引起的。
我給你改了兩個類,你看一下。
import java.util.ArrayList;
import java.util.List;
public class Storage {
private List<Integer> list = null;
private int index = 0;
public Storage() {
list = new ArrayList<Integer>();
}
public synchronized void setNum(int num) {
list.add(num);
}
public synchronized int GetNum() {
if (index == list.size()) {
return -1;
}
return list.get(index++);
}
}
public class Printer extends Thread {
Storage s;
private int len = 10;
public Printer() {
}
public Printer(String str) {
super(str);
}
public Printer(String str, Storage s, int len) {
super(str);
this.s = s;
this.len = len;
}
public void run() {
int index = 0;
System.out.println("讀數器線程開始運行");
while (true) {
synchronized (this) {
int value = s.GetNum();
if (value != -1) {
System.out.println("計數器當前的值為:" + value);
index++;
}
if (index == len) {
break;
}
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("讀數器線程結束運行");
}
}
因為線程分配的不確定性,所以列印的結束條件就不能用固定循環來控制。應該其它的條件來終目循環。
取數也一樣,存和取的時間順序都不固定,所以還是放到一個有序的集合中,通過取值索引來取值。
G. Java的線程在項目中一般會有什麼具體的應用
java線程在項抄目中的應用場景如下:
場景一:一個業務邏輯有很多次的循環,每次循環之間沒有影響,比如驗證1萬條url路徑是否存在,正常情況要循環1萬次,逐個去驗證每一條URL,這樣效率會很低,假設驗證一條需要1分鍾,總共就需要1萬分鍾,有點恐怖。這時可以用多線程,將1萬條URL分成50等份,開50個線程,沒個線程只需驗證200條,這樣所有的線程執行完是遠小於1萬分鍾的。
場景二:需要知道一個任務的執行進度,比如我們常看到的進度條,實現方式可以是在任務中加入一個整型屬性變數(這樣不同方法可以共享),任務執行一定程度就給變數值加1,另外開一個線程按時間間隔不斷去訪問這個變數,並反饋給用戶。
總之使用多線程就是為了充分利用cpu的資源,提高程序執行效率,當你發現一個業務邏輯執行效率特別低,耗時特別長,就可以考慮使用多線程。不過CPU執行哪個線程的時間和順序是不確定的,即使設置了線程的優先順序,因此使用多線程的風險也是比較大的,會出現很多預料不到的問題,一定要多熟悉概念,多構造不同的場景去測試才能夠掌握!
H. javaWeb中多線程具體應用到什麼地方、怎麼應用
在一個程序中,這些獨立運行的程序片斷叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然後程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以後才開始響應。
I. 線程應用-java小作業
1、創建一個動物集合,插入動物園中有的幾種動物(請給出10種)
2、一次性輸出內容
3、使用iterator遍歷集合中所有內容
4、將集合內容轉存儲於一個數字內,並在數組中進行排序
只列舉了2種動物,自己再添加
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.Collection;
importjava.util.Iterator;
/**
*
*@authorAdministrator
*/
interfaceAnimal{
publicStringtoString();
}
classCatimplementsAnimal,Comparable<Animal>{
publicStringname;
publicCat(){
super();
name="貓";
}
publicStringtoString(){
returnname;
}
@Override
publicintcompareTo(Animalo){
if(this.toString().compareTo(o.toString())==-1){
return-1;
}elseif(this.toString().compareTo(o.toString())==0){
return0;
}else
return1;
}
}
classDogimplementsAnimal,Comparable<Animal>{
publicStringname;
publicDog(){
super();
name="狗";
}
publicStringtoString(){
returnname;
}
@Override
publicintcompareTo(Animalo){
if(this.toString().compareTo(o.toString())==-1){
return-1;
}elseif(this.toString().compareTo(o.toString())==0){
return0;
}else
return1;
}
}
publicclassDemo8{
publicstaticvoidmain(String[]args){
//創建一個動物集合,插入動物園中有的幾種動物
Collection<Animal>col=newArrayList<Animal>();
col.add(newCat());
col.add(newDog());
col.add(newCat());
//一次性輸出內容
System.out.println(Arrays.toString(col.toArray()));
//使用iterator遍歷集合中所有內容
//並將集合內容轉存儲於一個數組內
Iterator<Animal>it=col.iterator();
intn=0;
Animal[]an=newAnimal[3];
while(it.hasNext()){
Animaltemp=(Animal)it.next();
System.out.println("使用iterator遍歷集合中所有內容:"+temp);
an[n++]=temp;
}
//並在數組中進行排序
Arrays.sort(an);
System.out.println(Arrays.toString(an));
}
J. 線程在Java Web項目中有哪些應用
首先對java的線程類Thread來進行說明:
Thread是針對是java其本身所具有的,但並不能說其沒有調用操作版系統,其最底層的時間片權調度是按照操作系統來執行的。
Thread下可以創建Thread,2個Thread在一定條件下也可以相互調用。
根據以上特點可以總結認為java中的線程能讓高級程序員更好的對龐大和復雜的數據流進行拆分,重組從而減低各個環節性能需求,通過增加各項負荷達到系統資源分配的最優值。
舉個例子:一個程序需要需要一個2.0GHZ的CPU,佔用10%的CPU使用1小時才能得出結果,最差方案就是用1小時。但有了線程使用多線程,在假設所有線程都可以並發執行的前提下我可以使用,10個線程讓CPU利用率達到100%,這時我只要6分鍾就可以有結果,雖然這些結果分散在10個不同的線程內,我可以再得到10個結果後對10個結果進行處理,得出最終結果,無論從時間維度還是CPU使用率維度,使用多線程是最優解。