P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

文章簡介

很多人對的Thread.join的作用以及實現(xiàn)了解得很少鹦肿,畢竟這個API我們很少使用。這篇文章仍然會結(jié)合使用及原理進行深度分析

內(nèi)容導航

  • 的Thread.join的作用
  • 的Thread.join的實現(xiàn)原理
  • 什么時候會使用的Thread.join

一箩溃、的Thread.join的作用

之前有人問過我一個這樣的面試題

Java的中如何讓多線程按照自己指定的順序執(zhí)行?

這個問題最簡單的回答是通過的Thread.join來實現(xiàn)涣旨,久而久之就讓很多人誤以為的Thread.join是用來保證線程的順序性的歪架。感興趣的可以加入我的學習圈子:142019080免費獲取

下面這段代碼演示了的Thread.join的作用

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

上面的代碼和蚪,注意部分,大家可以把這行代碼注釋以后看看運行效果攒霹,在沒有加加盟的時候運行的結(jié)果是不確定的。加了加入以后浆洗,運行結(jié)果按照遞增的順序展示出來。previousThread.join

的Thread.join的含義是當前線程需要等待previousThread線程終止之后才從的Thread.join返回伏社。簡單來說,就是線程沒有執(zhí)行完之前摘昌,會一直阻塞在加入方法處。

下面的圖表現(xiàn)了加盟對于線程的作用

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

二聪黎、的Thread.join的實現(xiàn)原理

線程是如何被阻塞的?又是通過什么方法喚醒的呢?先來看看的Thread.join方法做了什么事情

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

從加入方法的源碼來看杀赢,加入方法的本質(zhì)調(diào)用的是對象中的等待方法實現(xiàn)線程的阻塞,等待方法的實現(xiàn)原理我們在后續(xù)的文章再說詳細闡述脂崔。但是我們需要知道的是,調(diào)用等方法必須要獲取鎖砌左,所以加入方法是被同步的修飾的脖咐,同步的修飾在方法層面相當于同步(這)汇歹,這就是previousThread本身的實例。

有很多人不理解加入為什么阻塞的是主線程呢产弹?不理解的原因是阻塞主線程的方法是放在previousThread這個實例作用,讓大家誤以為應該阻塞previousThread線程痰哨。實際上主線程會持有previousThread這個對象的鎖,然后調(diào)用等方法去阻塞斤斧,而這個方法的調(diào)用者是在主線程中的早抠。所以造成主線程阻塞撬讽。

第二個問題,為什么previousThread線程執(zhí)行完畢就能夠喚醒住線程呢游昼?或者說是在什么時候喚醒的?

要了解這個問題酱床,我們又得翻JDK的源碼羊赵,但是如果大家對線程有一定的基本了解的話扇谣,通過等方法阻塞的線程,需要通過通知或者notifyAll的來喚醒罐寨。所以在線程執(zhí)行完畢以后會有一個喚醒的操作,只是我們不需要關(guān)心鸯绿。

接下來在熱點的源碼中找到,看看線程退出以后有沒有做相關(guān)的事情來證明我們的猜想。thread.cpp

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

一下觀察這行代碼上的注釋毒返,喚醒處于等待的線程對象,這個是在線程終止之后做的清理工作拧簸,這個方法的定義代碼片段如下ensure_join(this)

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

ensure_join方法中,調(diào)用喚醒所有等待thread鎖的線程盆赤,意味著調(diào)用了加入方法被阻塞的主線程會被喚醒;到目前為止,我們基本上對聯(lián)的原理做了一個比較詳細的分析lock.notify_all(thread);

總結(jié)歉眷,的Thread.join其實底層是通過等待/ notifyAll的來實現(xiàn)線程的通信達到線程阻塞的目的;當線程執(zhí)行結(jié)束以后,會觸發(fā)兩個事情汗捡,第一個是設(shè)置本地線程對象為空時,第二個是通過notifyAll的方法扇住,讓等待在previousThread對象鎖上的等待方法被喚醒庸追。

三台囱、什么時候會使用的Thread.join

在實際應用開發(fā)中,我們很少會使用的Thread.join簿训。在實際使用過程中,我們可以通過加入方法來等待線程執(zhí)行的結(jié)果强品,其實有點類似未來/調(diào)用的功能。

我們通過以下偽代碼來說明加入的使用場景

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理

《架構(gòu)師資料》領(lǐng)取方法

上圖中的資料都是我精心錄制視頻的榛,感興趣的可以加入我的學習圈子:142019080免費獲取

P7資深架構(gòu)師帶你分析的Thread.join的作用和原理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市夫晌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓淀,老刑警劉巖所袁,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凶掰,死亡現(xiàn)場離奇詭異蜈亩,居然都是意外死亡,警方通過查閱死者的電腦和手機稚配,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來港华,“玉大人,你說我怎么就攤上這事苹丸。” “怎么了赘理?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長商模。 經(jīng)常有香客問我奠旺,道長施流,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任瞪醋,我火速辦了婚禮,結(jié)果婚禮上银受,老公的妹妹穿的比我還像新娘践盼。我一直安慰自己宾巍,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布顶霞。 她就那樣靜靜地躺著,像睡著了一般选浑。 火紅的嫁衣襯著肌膚如雪蓝厌。 梳的紋絲不亂的頭發(fā)上鲜侥,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音描函,去河邊找鬼。 笑死舀寓,一個胖子當著我的面吹牛胆数,可吹牛的內(nèi)容都是我干的互墓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼篡撵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了育谬?” 一聲冷哼從身側(cè)響起券盅,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锰镀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咖刃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嚎杨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了枫浙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翠胰。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡之景,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膏潮,到底是詐尸還是另有隱情,我是刑警寧澤焕参,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布轻纪,位于F島的核電站叠纷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涩嚣。R本人自食惡果不足惜崇众,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顷歌。 院中可真熱鬧,春花似錦眯漩、人聲如沸芹扭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽队萤。三九已至轮锥,卻和暖如春浮禾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盈电。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匆帚,地道東北人熬词。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓吸重,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚎幸。 傳聞我的和親對象是個殘疾皇子颜矿,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一骑疆、進程和線程 進程 進程就是一個執(zhí)行中的程序?qū)嵗總€進程都有自己獨立的一塊內(nèi)存空間替废,一個進程中可以有多個線程。...
    阿敏其人閱讀 2,611評論 0 13
  • 文章簡介 很多人對Thread.join的作用以及實現(xiàn)了解得很少椎镣,畢竟這個api我們很少使用诈火。這篇文章仍然會結(jié)合使...
    跟著Mic學架構(gòu)閱讀 83,805評論 20 60
  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評論 1 18
  • 本文主要講了java中多線程的使用方法冷守、線程同步刀崖、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應的一些線程函數(shù)用法蒲跨、概述等译断。 首先講...
    李欣陽閱讀 2,444評論 1 15
  • 林炳文Evankaka原創(chuàng)作品。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 647評論 0 4