for迴圈中多執行緒的無序性
阿新 • • 發佈:2018-12-30
在學習多執行緒的互斥與同步中遇到一個問題,如下:
public class Test { static int i; public static void main(String[] args) { for(i=0; i<10; i++){ new Thread(){ public void run(){ System.out.println(i); } }.start(); // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } } } }
出現結果在意料之外,結果共輸出10次,不按順序輸出。之前詢問學長,學長沒有給我一個十分合理的答案。回頭再網上看別人的部落格,得到了一個比較合理的解答。
問題解答:
通過在主執行緒中的一個for迴圈,向執行緒池提交10個執行任務的時候,如果通過斷點除錯,發現先被新增到執行緒池中的執行緒先獲得執行機會,後面阻塞等待訊號量的執行緒也是先加入執行緒池的優先獲得訊號量。但是在執行的時候,實際情況則是亂序的。
主要的原因是因為執行的時候沒有設定斷點,住執行緒中的for迴圈在瞬間完成,也就是說機會在同一時刻向執行緒池中提交了10個執行任務,然後執行緒池會為這20個執行任務分配執行緒,然後挑出前5個執行緒執行。 等這5個執行緒中的一個執行完成以後,會按照一定的策略從剩下的執行緒中挑出一個來執行。