Java多執行緒/併發07、Thread.Join()讓呼叫執行緒等待子執行緒
開始之前,有幾點要理解的:
1、當程式執行的時侯,系統預設開啟了一個主執行緒(假設命名mainThread)。通常我們在Main()函式中定義主執行緒的工作。
2、可以在Main()函式中啟動多個子執行緒:Thread-1,Thread-2,Thread-3等。
3、主執行緒有可能比子執行緒先結束執行。
第三點是關鍵,這也是要用到join()方法的一個重要原因,因為有時侯我們希望主執行緒等待子執行緒執行完成之後再結束。
看一個例子:在主執行緒中開啟一個子執行緒,用來計算1至100的和,然後在主執行緒中列印出來
package JConcurrence.Study;
public class JoinDemo {
static int result = 0;
public static void main(String[] args) {
Thread subThread = new Thread() {
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
result = result + i;
/*模擬耗時操作*/
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
subThread.start();
System.out.print(result);
}
}
程式執行結果:
1到100求和結果等於:0
出錯了。程式執行進入Main()函式後,開啟子執行緒subThread計算求和。此時主執行緒並沒有停止,繼續往下執行。子執行緒subThread執行耗時大約2秒,而主執行緒如出膛子彈迅速往下執行完畢。子執行緒此該還沒有反應過來,主執行緒已經輸出了結果。
為了輸出正確的結果,顯而易見,必須讓主執行緒等待子執行緒執行完畢再執行System.out.print。
這時,輪到Thread.Join()出場了。
在subThread.start()和System.out.print(result)之間加上
try {
subThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
程式執行結果:
1到100求和結果等於:5050
結果正確!
Join()方法中可以設定值,即等待多久。比如上面如果把subThread.join()改為subThread.join(1000),就是告訴主執行緒等待子執行緒1秒鐘後再繼續執行。你可以這樣修改後試著執行一下程式,這時程式輸出的應該是0到5050間的一個值。
注意事項
在多個子執行緒的情況下,若依次執行每個執行緒的start()和join()方法,則各個執行緒之間是同步的。
for(int i=1;i<=3;i++){
Thread subThread = new Thread(new workrun(i));
subThread.start();
subThread.join();
}
上面程式中的三個子執行緒會順序同步的執行。
要想三個子執行緒能夠併發執行,需要改變join呼叫位置
Thread subThread1 = new Thread(new workrun(1));
Thread subThread2 = new Thread(new workrun(2));
Thread subThread3 = new Thread(new workrun(3));
subThread1.start();
subThread2.start();
subThread3.start();
subThread1.join();
subThread2.join();
subThread3.join();
相關文章
- Java多執行緒——執行緒Java執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- JAVA多執行緒併發Java執行緒
- [Java併發]執行緒的並行等待Java執行緒並行
- 多執行緒併發篇——如何停止執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java:多執行緒等待所有執行緒結束(CountDownLatch/CyclicBarrier) .Java執行緒CountDownLatch
- Java 多執行緒基礎(八)執行緒讓步Java執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- Java併發和多執行緒4:使用通用同步工具CountDownLatch實現執行緒等待Java執行緒CountDownLatch
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- java 多執行緒 併發 面試Java執行緒面試
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- Java 多執行緒基礎(六)執行緒等待與喚醒Java執行緒
- Java多執行緒/併發06、執行緒鎖Lock與ReadWriteLockJava執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- Java 併發和多執行緒(一) Java併發性和多執行緒介紹[轉]Java執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 多執行緒【執行緒池】執行緒