一、什麼情況下適合用多執行緒
(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介面。如果不放在其他執行緒執行,會 阻塞 住主線程...