《java多線程編程核心技術(shù)》-----使用jion()方法時富蓄,代碼的執(zhí)行順序總結(jié)

在讀到《java多線程編程核心技術(shù)》的3.2節(jié)“jion方法的使用”的時候立倍,看到如下代碼口注,便有了這篇總結(jié)的文章寝志。


TheadA.java:

public class ThreadA extends Thread {
    private ThreadB b;

    public ThreadA(ThreadB b) {
        super();
        this.b = b;
    }

    @Override
    public void run() {
        try {
            synchronized (b) {
                System.out.println("begin A ThreadName="
                        + Thread.currentThread().getName() + "  "
                        + System.currentTimeMillis());
                Thread.sleep(5000);
                System.out.println("  end A ThreadName="
                        + Thread.currentThread().getName() + "  "
                        + System.currentTimeMillis());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ThreadB.java:

public class ThreadB extends Thread {
    @Override
    synchronized public void run() {
        try {
            System.out.println("begin B ThreadName="
                    + Thread.currentThread().getName() + "  "
                    + System.currentTimeMillis());
            Thread.sleep(5000);
            System.out.println("  end B ThreadName="
                    + Thread.currentThread().getName() + "  "
                    + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Main.java

public class Main{
    public static void main(String[] args) {
        try {
            ThreadB b = new ThreadB();
            ThreadA a = new ThreadA(b);
            a.start();
            b.start();
            b.join(2000);
            System.out.println("    main end "
                    + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

jion方法的源代碼:

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;
            }
        }
    }

如上的3個類舰攒,組成的這篇博文的主角悔醋。當(dāng)我們執(zhí)行main方法后芬骄,有幾率會出現(xiàn)如下順序的日志:

  • 日志1:
begin A ThreadName=Thread-1  1545465206016
  end A ThreadName=Thread-1  1545465211018
   main end 1545465211019
begin B ThreadName=Thread-0  1545465211020
  end B ThreadName=Thread-0  1545465216028

根據(jù)該日志的打印順序和結(jié)果來看:

  1. b.join(2000)處账阻,jion方法拿到鎖淘太,然后在jion方法里執(zhí)行到wait()時釋放鎖蒲牧。
  2. 線程a獲得鎖,TheadA類的run()中的sleep(5000)處阻塞松嘶,直到run()方法執(zhí)行完畢翠订,線程a釋放鎖尽超。在進(jìn)入run方法2s后梧躺,b.jion()方法在wait()處被喚醒燥狰,進(jìn)入激活隊(duì)列等待執(zhí)行龙致。
  3. b.jion(2000)和線程b競爭鎖目代,結(jié)果b.jion(2000)得到鎖,然后執(zhí)行wait()方法和面的代碼在讶,jion()方法執(zhí)行完构哺,然后釋放鎖曙强。
    4.現(xiàn)在main線程和b線程異步執(zhí)行碟嘴,但是main線程的system.out.print()先于線程b的輸出執(zhí)行囊卜。

  1. 日志2:
begin A ThreadName=Thread-1  1545467317710
  end A ThreadName=Thread-1  1545467322712
begin B ThreadName=Thread-0  1545467322714
   main end 1545467322714
  end B ThreadName=Thread-0  1545467327715

根據(jù)該日志的打印順序和結(jié)果來看:

  1. b.join(2000)處栅组,jion方法拿到鎖玉掸,然后在jion方法里執(zhí)行到wait()時釋放鎖排截。
  2. 線程a獲得鎖断傲,TheadA類的run()中的sleep(5000)處阻塞认罩,直到run()方法執(zhí)行完畢,線程a釋放鎖宦搬。在進(jìn)入run方法2s后间校,b.jion()方法在wait()處被喚醒憔足,進(jìn)入激活隊(duì)列等待執(zhí)行滓彰。
  3. b.jion(2000)和線程b競爭鎖,結(jié)果b.jion(2000)得到鎖弓候,然后執(zhí)行wait()方法和面的代碼菇存,jion()方法執(zhí)行完撰筷,然后釋放鎖毕籽。
  4. 現(xiàn)在main線程和b線程異步執(zhí)行井辆,但是main線程的system.out.print()后于線程b的輸出執(zhí)行杯缺。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袍榆,一起剝皮案震驚了整個濱河市包雀,隨后出現(xiàn)的幾起案子亲铡,更是在濱河造成了極大的恐慌奖蔓,老刑警劉巖吆鹤,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轰异,死亡現(xiàn)場離奇詭異暑始,居然都是意外死亡廊镜,警方通過查閱死者的電腦和手機(jī)嗤朴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門股缸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吱雏,“玉大人歧杏,你說我怎么就攤上這事犬绒】Γ” “怎么了咐鹤?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵慷暂,是天一觀的道長行瑞。 經(jīng)常有香客問我血久,道長氧吐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮游盲,結(jié)果婚禮上蛮粮,老公的妹妹穿的比我還像新娘然想。我一直安慰自己变泄,他們只是感情好杖刷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布滑燃。 她就那樣靜靜地躺著表窘,像睡著了一般乐严。 火紅的嫁衣襯著肌膚如雪昂验。 梳的紋絲不亂的頭發(fā)上既琴,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天甫恩,我揣著相機(jī)與錄音,去河邊找鬼抛虫。 笑死简僧,一個胖子當(dāng)著我的面吹牛涎劈,可吹牛的內(nèi)容都是我干的蛛枚。 我是一名探鬼主播蹦浦,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溉贿!你這毒婦竟也來了浦旱?” 一聲冷哼從身側(cè)響起颁湖,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤抢蚀,失蹤者是張志新(化名)和其女友劉穎皿曲,沒想到半個月后屋休,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妈倔,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毅哗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年尿瞭,在試婚紗的時候發(fā)現(xiàn)自己被綠了翅睛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捕发。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡扎酷,死狀恐怖法挨,靈堂內(nèi)的尸體忽然破棺而出凡纳,到底是詐尸還是另有隱情,我是刑警寧澤荐糜,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布丛版,位于F島的核電站页畦,受9級特大地震影響豫缨,放射性物質(zhì)發(fā)生泄漏端朵。R本人自食惡果不足惜冲呢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一邻薯、第九天 我趴在偏房一處隱蔽的房頂上張望厕诡。 院中可真熱鬧灵嫌,春花似錦、人聲如沸猖凛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艰管。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猎塞,已是汗流浹背荠耽。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慢叨,地道東北人拍谐。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓轩拨,卻偏偏與公主長得像气嫁,于是被迫代替她去往敵國和親寸宵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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