java多線程 join方法詳解

重點:
1.join()的作用是讓“主線程”等待“子線程”結(jié)束之后才能繼續(xù)運行
2.wait()的作用是讓“當(dāng)前線程”等待烁巫,而這里的“當(dāng)前線程”是指當(dāng)前在CPU上運行的線程。所以甥角,雖然是調(diào)用子線程的wait()方法,但是它是通過“主線程”去調(diào)用的纱兑;所以因俐,休眠的是主線程,而不是“子線程”妄呕!

正文部分:

package thread;

public class MyThread1 extends Thread {
    private String name;

    public MyThread1(String name) {
        this.name = name;
    }
    @Override
    public void run(){

            System.out.println(name+"運行");


    }

    public static void main(String[] args) throws InterruptedException {
        MyThread1 myThreadA = new MyThread1("A");
        MyThread1 myThreadB = new MyThread1("B");
        MyThread1 myThreadC = new MyThread1("C");
        myThreadA.start();
        /**join的意思是使得放棄當(dāng)前線程的執(zhí)行陶舞,并返回對應(yīng)的線程,例如下面代碼的意思就是:
         程序在main線程中調(diào)用t1線程的join方法绪励,則main線程放棄cpu控制權(quán)肿孵,并返回t1線程繼續(xù)執(zhí)行直到線程t1執(zhí)行完畢
         所以結(jié)果是t1線程執(zhí)行完后,才到主線程執(zhí)行疏魏,相當(dāng)于在main線程中同步t1線程停做,t1執(zhí)行完了,main線程才有執(zhí)行的機會
         */
        myThreadA.join();
        myThreadB.start();
        myThreadB.join();
        myThreadC.start();
    }
}


  1. join()源碼分析(基于JDK1.7.0_40)
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;
            }
        }
    }

說明:
從代碼中大莫,我們可以發(fā)現(xiàn)蛉腌。當(dāng)millis==0時,會進入while(isAlive())循環(huán)只厘;即只要子線程是活的烙丛,主線程就不停的等待。
我們根據(jù)上面解釋join()作用時的代碼來理解join()的用法羔味!
問題:
雖然s.join()被調(diào)用的地方是發(fā)生在“Father主線程”中河咽,但是s.join()是通過“子線程s”去調(diào)用的join()。那么赋元,join()方法中的isAlive()應(yīng)該是判斷“子線程s”是不是Alive狀態(tài)忘蟹;對應(yīng)的wait(0)也應(yīng)該是“讓子線程s”等待才對。但如果是這樣的話们陆,s.join()的作用怎么可能是“讓主線程等待寒瓦,直到子線程s完成為止”呢,應(yīng)該是讓"子線程等待才對(因為調(diào)用子線程對象s的wait方法嘛)"坪仇?
答案:wait()的作用是讓“當(dāng)前線程”等待杂腰,而這里的“當(dāng)前線程”是指當(dāng)前在CPU上運行的線程。所以椅文,雖然是調(diào)用子線程的wait()方法喂很,但是它是通過“主線程”去調(diào)用的惜颇;所以,休眠的是主線程少辣,而不是“子線程”凌摄!

結(jié)果說明:
運行流程如圖
(01) 在“主線程main”中通過 new ThreadA("t1") 新建“線程t1”。 接著漓帅,通過 t1.start() 啟動“線程t1”锨亏,并執(zhí)行t1.join()。

(02) 執(zhí)行t1.join()之后忙干,“主線程main”會進入“阻塞狀態(tài)”等待t1運行結(jié)束器予。“子線程t1”結(jié)束之后捐迫,會喚醒“主線程main”乾翔,“主線程”重新獲取cpu執(zhí)行權(quán),繼續(xù)運行施戴。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末反浓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赞哗,更是在濱河造成了極大的恐慌雷则,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肪笋,死亡現(xiàn)場離奇詭異巧婶,居然都是意外死亡,警方通過查閱死者的電腦和手機涂乌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門艺栈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人湾盒,你說我怎么就攤上這事湿右。” “怎么了罚勾?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵毅人,是天一觀的道長。 經(jīng)常有香客問我尖殃,道長丈莺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任送丰,我火速辦了婚禮缔俄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己俐载,他們只是感情好蟹略,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遏佣,像睡著了一般挖炬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上状婶,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天意敛,我揣著相機與錄音,去河邊找鬼膛虫。 笑死空闲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的走敌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逗噩,長吁一口氣:“原來是場噩夢啊……” “哼掉丽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起异雁,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捶障,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纲刀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體项炼,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年示绊,在試婚紗的時候發(fā)現(xiàn)自己被綠了锭部。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡面褐,死狀恐怖拌禾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情展哭,我是刑警寧澤湃窍,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站匪傍,受9級特大地震影響您市,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜役衡,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一茵休、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦泽篮、人聲如沸盗尸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泼各。三九已至,卻和暖如春亏拉,著一層夾襖步出監(jiān)牢的瞬間扣蜻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工及塘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莽使,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓笙僚,卻偏偏與公主長得像芳肌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肋层,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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

  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍閱讀 7,353評論 3 87
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評論 1 18
  • 本文主要講了java中多線程的使用方法亿笤、線程同步、線程數(shù)據(jù)傳遞栋猖、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法净薛、概述等。 首先講...
    李欣陽閱讀 2,454評論 1 15
  • 寫在前面的話: 這篇博客是我從這里“轉(zhuǎn)載”的蒲拉,為什么轉(zhuǎn)載兩個字加“”呢肃拜?因為這絕不是簡單的復(fù)制粘貼,我花了五六個小...
    SmartSean閱讀 4,730評論 12 45
  • 上一章 (三十二)往事圍困 白氏傳媒和明亮國際合作之后獨立制作的第一部大IP電視劇正式對媒體亮相雌团∪剂欤《消失的未婚夫》...
    夏沐春吟閱讀 249評論 0 1