關於多執行緒

2021-09-29 00:12:08 字數 3014 閱讀 9637

一、什麼情況下適合用多執行緒

(1)、計算量大,可以分段計算的情況。

(2)、分段計算或者執行,沒有依賴關係的情況。

二、多執行緒的實現:

(1)、一般來說,很少使用原生的new thread(繼承runnable的物件)來執行多執行緒任務,因為這種方式

第一,沒有用到執行緒池,不利於執行緒管理,

第二,runnable沒有返回值和異常處理,拿不到最終的結果,也發現不了異常情況。

(2)、用得最多的還是callable介面配合future來實現多執行緒,

callable實現類裡面執行具體的**,並且返回計算結果,

返回到future物件,future通過get方式獲取執行緒執行的結果。

二、執行緒服務:

一般有兩種:executorservice和completionservice,

都通過submit方法來執行callable裡面的call()方法,從而執行多執行緒執行任務並返回結果。

不同點:

completionservice是實現了非阻塞佇列的,

說得通俗一點,就是completionservice.take()方法返回結果的時候,

是先進先出(提交多個執行緒任務,那個任務先執行完,就先返回那個任務結果)

executorservice的方式,get()方法是阻塞式方法,通俗點說,就是它會按照多執行緒任務執行的順序阻塞,

也就是第乙個任務結果,如果沒有返回,第二個任務結果也不能返回。

鑑於以上,如果結果集要按照執行順序來獲取,建議使用executorservice的方式,如果沒有順序的要求,建議completionservice.take()。

三、上**

(1)、用completionservice、future、callable實現多執行緒計算1到100相加

callable.class:任務類,多執行緒具體要執行什麼,要返回什麼? 都在這個類裡面寫

public class counttask implements callable

@override

public integer call() throws exception

system.out.println("當前執行緒計算:"+startnum+"到"+endnum+"的資料");

return count;}}

main方法執行:

public static void main(string args) 

int sum=0;

for(int i = 1;i<=10;i++ ) catch (interruptedexception e) catch (executionexception e)

}//結束

long endtime=system.currenttimemillis();

system.out.println("多執行緒合計為:"+sum+",耗時:"+(endtime-starttime));

integer count=0;

//開始(單執行緒)

long singlestarttime=system.currenttimemillis();

for (int k=1;k<=100;k++) catch (interruptedexception e)

}//結束(單執行緒)

long singleendtime=system.currenttimemillis();

system.out.println("單執行緒合計為:"+sum+",耗時:"+(singleendtime-singlestarttime));

}

執行結果:

可以看到,取出的結果不是按照執行順序來的。證明這種方式是非阻塞的,也就是完成乙個執行緒任務取乙個結果,

速度比較快,但是結果順序不保證。

(2)、用executorservice、future、callable實現多執行緒計算1到100相加

main方法執行:

public static void main(string args) 

int sum=0;

//遍歷future集合

for (futurefuture: futurelist) catch (interruptedexception e) catch (executionexception e)

}//結束

long endtime=system.currenttimemillis();

system.out.println("多執行緒合計為:"+sum+",耗時:"+(endtime-starttime));

}

執行結果:

可以看出,結果返回是完全按照executor.submit()的順序來的,也就是在future.get()的時候會阻塞,說白了就是多執行緒任務執行的時候是非同步的,但是取出的時候又是序列的,要乙個乙個來。這種相對於上面一種方式,效率會低一些,但是可以保證結果集的順序。

四、其它

關於synchronize,就是執行緒**中,執行某些必須要保證執行緒安全的**時,將當期物件鎖住,不讓其它執行緒操作,

從而犧牲了效率,但是保證了資料安全性,避免了髒資料產生。建議寫synchronize**塊比較好,比較同步執行的**越少,效率越高。

其它的wait():執行緒等待 notify():喚醒 join():主線程等待 yield():放棄 thread.sleep():休眠和執行緒的狀態等知識,

基本上看看api就懂了,就不再贅述了。

關於多執行緒

1 程序是不活潑的。程序從來不執行任何東西,它只是執行緒的容器。執行緒總是在某個程序環境中建立的,而且它的整個壽命期都在該程序中。這意味著執行緒在它的程序 位址空間中執行 並且在程序的位址空間中對資料進行操作。因此,如果在單程序環境中,你有兩個或多個執行緒正在執行,那麼這兩個執行緒將共享單個位址空 ...

關於多執行緒

關於多執行緒 多執行緒的意思其實就是可以同時執行多個程式,並且互相之間不受影響 不過先後順序都不確定 單執行緒的缺點 雖然可以用while迴圈保證服務端可以一直服務,但是每一次只能服務乙個使用者,且read 方法是阻塞方法,如果這個已建立連線的使用者一直沒有發訊息,那麼連線就會一直阻塞在這,直到使用...

關於多執行緒

多執行緒技術 通過併發提高程式的整體效能。程序 應用程式,負責開闢一塊記憶體區域,用程式執行 每乙個程序都預設有乙個 主線程 執行緒 要執行的任務流 當有耗時操作時,可能需要在後台新建乙個子執行緒,來單獨處理這些耗時的操作,待操作完成之後,再更新ui介面。如果不放在其他執行緒執行,會 阻塞 住主線程...