深入源碼剖析Thread.join實現

java.lang.Thread類提供一個靜態方法join可以阻塞主線程(調用join方法的線程),直到當前線程執行完。用法如下:
這裏寫圖片描述

join會保證t2在t1線程執行完退出之後再執行,程序執行結果總是如下
這裏寫圖片描述

定義

這裏寫圖片描述

實現

該方法掉用了join(0)方法, 我們跟進查看具體實現。注意這裏是一個靜態方法加了同步鎖,鎖的是this,也就是當前類實例。我們知道在線程獲取了鎖以後再執行wait方法,會讓線程釋放掉鎖,並且進入到等待阻塞狀態,線程被喚醒或等待一定時間之後以後獲取鎖後會重新從wait的地方往下執行。
作者巧用了這個原理,先獲取鎖再調用wait(0)釋放鎖並讓主線程進入等待阻塞。並且循環執行,一旦主線程重新獲取鎖就立馬釋放。這樣就保證了主線程一直得不到執行。
這裏寫圖片描述

按照上訴代碼,如果執行t.join(10 * 1000)那麼主線程會阻塞10s,而事實並非如此,請看下面測試代碼
這裏寫圖片描述

輸出如下
這裏寫圖片描述

這說明t線程執行完,main線程就得到執行,並沒有阻塞10s,也就是說main線程得到了喚醒。翻看JVM源碼發現在線程結束的時候會調用lock.notify_all(thread)喚醒線程
這裏寫圖片描述

總結

  1. java.lang.Thread.join方法通過循環阻塞主線程的方式保證當前線程優先執
  2. 當前線程執行完之後會立馬喚醒主線程繼續執行

文章參考:https://www.zhihu.com/question/44621343/answer/97640972

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章