我也学习JAVA多线程-join
【原文鏈接】:https://blog.tecchen.xyz ,博文同步發布到博客園。
由于精力有限,對文章的更新可能不能及時同步,請點擊上面的原文鏈接訪問最新內容。
歡迎訪問我的個人網站:https://www.tecchen.xyz 。
在工作中,挺少遇到join關鍵字,但很多多線程資料和面試過程中,初中級開發工程師總會遇到join。
今天一起學習下join。
join的作用:等待指定的時間(當為0時,一直等待),直到這個線程執行結束。
先看join方法的定義,join是java.lang.Thread的一個普通方法。
演示代碼
public class ThreadLearnJoin {public static void main(String[] args) throws InterruptedException {Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "睡覺");try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "起床");}}, "sub-thread");t.start();System.out.println(Thread.currentThread().getName() + "線程join前");t.join();System.out.println(Thread.currentThread().getName() + "線程join后");} }執行結果
main線程join前 sub-thread睡覺 sub-thread起床 main線程join后源碼分析
繼續分析join(0)的代碼,首先需要注意的是synchronized關鍵字,其次是isAlive()和wait(0)。在演示代碼中,主線程調用名稱為sub-thread的子線程t的join()方法。
主線程先獲取t對象上的鎖,并且當t為Alive狀態時,繼續調用t的wait(0)方法。
由于wait()方法是Object的方法,跟子線程t并沒有關系,wait()會釋放t對象上的鎖,并阻塞當前main線程。
這里也就隱藏了一個點:t線程調用start()后,進入執行狀態,運行run()方法中的代碼,和t對象上的鎖并沒有任何關系。
run方法并沒有進入synchronized的同步區。
參考資料
- Java多線程系列--“基礎篇”08之 join()
以下是Java多線程系列--“基礎篇”08之 join()的評論,可以幫助大家理解記憶。
- Java join()使用及源碼分析
轉載于:https://www.cnblogs.com/Candies/p/10635419.html
總結
以上是生活随笔為你收集整理的我也学习JAVA多线程-join的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Docker打包发布Django应用
- 下一篇: P3159 [CQOI2012]交换棋子