Java多線程-Thread.join()

Java多線程-Thread.join()

Thread.join()把制定的線程加入到當(dāng)前線程坞嘀,可以將兩個(gè)交替執(zhí)行的多線程合并為順序執(zhí)行的線程轧膘。比如在線程B中調(diào)用累線程A的join()方法逆趋,直到線程A執(zhí)行完畢后,才會(huì)繼續(xù)執(zhí)行線程B;

eg:

線程A代碼:

public class A extends Thread{

@Override

? ? ? ? public void run() {

? ? ? ? ? ?for (int i =0; i <500 ; i++) {

? ? ? ? ?System.out.println("A--thread:"+i);

? ? ? ? ? ?}

}

}

線程B的代碼:

public class Bextends Thread {

@Override

? ? public void run() {

A a =new A();

a.start();

try {

? ? ? ? ? ?a.join();// 調(diào)用join方法

? ? ? ? ? ? for (int i =0; i <500 ; i++) {

? ? ? ? ?System.out.println("Thread-B:"+i);

}

}catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args){

new B().start();

}

}

觀察結(jié)果:在線程B的run方法中啟動(dòng)類線程A的start方法和join(),打印的結(jié)果沒(méi)有交叉執(zhí)行匾乓÷济海可以得出上面的結(jié)論鳄厌。感興趣的同學(xué)可以將線程a.join()方法注視掉,觀看打印結(jié)果有沒(méi)有交叉執(zhí)行妈踊。???

結(jié)論:? ?當(dāng)我們調(diào)用某個(gè)線程的join這個(gè)方法時(shí)了嚎,這個(gè)方法會(huì)掛起調(diào)用線程,直到被調(diào)用線程結(jié)束執(zhí)行廊营,調(diào)用線程才會(huì)繼續(xù)執(zhí)行歪泳。

源碼解析:

Thread 源碼有3個(gè)join方法重載。

public final void join()throws InterruptedException {

join(0);

}露筒;

public final synchronized void join(long millis,int nanos)

throws InterruptedException {

if (millis <0) {

throw new IllegalArgumentException("timeout value is negative");

}

if (nanos <0 || nanos >999999) {

throw new IllegalArgumentException(

"nanosecond timeout value out of range");

}

if (nanos >=500000 || (nanos !=0 && millis ==0)) {

millis++;

}

join(millis);

}

public final synchronized void join(long millis)

throws InterruptedException {

long base = System.currentTimeMillis();

long now =0;

if (millis <0) {

throw new IllegalArgumentException("timeout value is negative");

}

if (millis ==0) {

while (isAlive()) {

wait(0);

}

}else {

while (isAlive()) {

long delay = millis - now;

if (delay <=0) {

break;

}

wait(delay);

now = System.currentTimeMillis() - base;

}

}

其中

a. join() 和 join(long millis, int nanos) 最后都調(diào)用了?join(long millis)呐伞。

b. 帶參數(shù)的 join() 都是 synchronized method。

c. join() 調(diào)用了 join(0)慎式,從源碼可以看到 join(0) 不斷檢查當(dāng)前線程(join() 所屬的線程實(shí)例伶氢,非調(diào)用線程)是否是 Active。

d. join() 和 sleep() 一樣瘪吏,都可以被中斷(被中斷時(shí)癣防,會(huì)拋出 InterrupptedException 異常);不同的是肪虎,join() 內(nèi)部調(diào)用了 wait()劣砍,會(huì)出讓鎖,而 sleep() 會(huì)一直保持鎖扇救。


以本文開(kāi)頭的代碼為例刑枝,我們分析一下代碼邏輯:

B 調(diào)用 a.join()香嗓,a.join() 再調(diào)用 a.join(0) (此時(shí) B 會(huì)獲得 child 實(shí)例作為鎖,其他線程可以進(jìn)入 child.join() 装畅,但不可以進(jìn)入 child.join(0)(同步的)靠娱, 因?yàn)闊o(wú)法獲取鎖)。child.join(0) 會(huì)不斷地檢查 child 線程是否是 Active掠兄。

如果 child 線程是 Active像云,則循環(huán)調(diào)用 child.wait(0)(為了防止 Spurious wakeup, 需要將 wait(0) 放入 for 循環(huán)體中;此時(shí) B 會(huì)釋放 a 實(shí)例鎖蚂夕,其他線程可以競(jìng)爭(zhēng)鎖并進(jìn)入 a.join(0)迅诬。我們可以得知,可以有多個(gè)線程等待某個(gè)線程執(zhí)行完畢)婿牍。

一旦 a 線程不為 Active (狀態(tài)為 TERMINATED), a.join(0) 會(huì)直接返回到 a.join(), a.join() 會(huì)直接返回到 B 父線程侈贷,B 父線程就可以繼續(xù)運(yùn)行下去了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末等脂,一起剝皮案震驚了整個(gè)濱河市俏蛮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌上遥,老刑警劉巖搏屑,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異粉楚,居然都是意外死亡辣恋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門模软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抑党,“玉大人,你說(shuō)我怎么就攤上這事撵摆。” “怎么了害晦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵特铝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我壹瘟,道長(zhǎng)鲫剿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任稻轨,我火速辦了婚禮灵莲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殴俱。我一直安慰自己政冻,他們只是感情好枚抵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著明场,像睡著了一般汽摹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苦锨,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天逼泣,我揣著相機(jī)與錄音,去河邊找鬼舟舒。 笑死拉庶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秃励。 我是一名探鬼主播氏仗,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莺治!你這毒婦竟也來(lái)了廓鞠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谣旁,失蹤者是張志新(化名)和其女友劉穎床佳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榄审,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砌们,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搁进。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浪感。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饼问,靈堂內(nèi)的尸體忽然破棺而出影兽,到底是詐尸還是另有隱情,我是刑警寧澤莱革,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布峻堰,位于F島的核電站,受9級(jí)特大地震影響盅视,放射性物質(zhì)發(fā)生泄漏捐名。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一闹击、第九天 我趴在偏房一處隱蔽的房頂上張望镶蹋。 院中可真熱鬧,春花似錦、人聲如沸贺归。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牧氮。三九已至琼腔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踱葛,已是汗流浹背丹莲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尸诽,地道東北人甥材。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像性含,于是被迫代替她去往敵國(guó)和親洲赵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    小徐andorid閱讀 2,808評(píng)論 3 53
  • 一商蕴、認(rèn)識(shí)多任務(wù)叠萍、多進(jìn)程、單線程绪商、多線程 要認(rèn)識(shí)多線程就要從操作系統(tǒng)的原理說(shuō)起苛谷。 以前古老的DOS操作系統(tǒng)(V 6....
    GT921閱讀 1,013評(píng)論 0 3
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評(píng)論 1 18
  • 說(shuō)到復(fù)制品例书,我們需要先來(lái)看一下锣尉,什么復(fù)制品? 百度百科給出的解釋是這樣的: 通過(guò)碳紙印相法制出的圖像决采;仿造的物品(...
    苗棟棟閱讀 913評(píng)論 3 1
  • 隔了窗戶紙 說(shuō)到鎖自沧,各種書(shū)籍或者博客上嗖嗖嗖就能上來(lái)一堆關(guān)于鎖的名詞,比如讀寫鎖树瞭、互斥鎖暂幼、自旋鎖,等等移迫。然后介紹這...
    陳半仙兒閱讀 190評(píng)論 0 0