日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java中Thread.join()的使用方法

瀏覽:23日期:2022-08-27 16:58:16

概要

本文分三個部分對Thread.join()進行分析:

1. join() 的示例和作用

2. join() 源碼分析

3. 對網上其他分析 join() 的文章提出疑問

1. join() 的示例和作用

1.1 示例

// 父線程public class Parent { public static void main(String[] args) { // 創建child對象,此時child表示的線程處于NEW狀態 Child child = new Child(); // child表示的線程轉換為RUNNABLE狀態 child.start(); // 等待child線程運行完再繼續運行 child.join(); }}

// 子線程public class Child extends Thread { public void run() { // ... }}

上面代碼展示了兩個類:Parent(父線程類),Child(子線程類)。

Parent.main()方法是程序的入口,通過Child child = new Child(); 新建child子線程(此時 child子線程處于NEW狀態);

然后調用child.start()(child子線程狀態轉換為RUNNABLE);

再調用child.join(),此時,Parent父線程會等待child子線程運行完再繼續運行。

下圖是我總結的 Java 線程狀態轉換圖:

Java中Thread.join()的使用方法

1.2 join() 的作用

讓父線程等待子線程結束之后才能繼續運行。

我們來看看在 Java 7 Concurrency Cookbook 中相關的描述(很清楚地說明了 join() 的作用):

Waiting for the finalization of a thread

In some situations, we will have to wait for the finalization of a thread. For example, we mayhave a program that will begin initializing the resources it needs before proceeding with therest of the execution. We can run the initialization tasks as threads and wait for its finalizationbefore continuing with the rest of the program.For this purpose, we can use the join() method of the Thread class. When we call thismethod using a thread object, it suspends the execution of the calling thread until the objectcalled finishes its execution.

當我們調用某個線程的這個方法時,這個方法會掛起調用線程,直到被調用線程結束執行,調用線程才會繼續執行。

2. join() 源碼分析

以下是 JDK 8 中 join() 的源碼:

public final void join() throws InterruptedException { join(0);}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; } }}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);}

join() 一共有三個重載版本,分別是無參、一個參數、兩個參數:

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

其中

(1)三個方法都被final修飾,無法被子類重寫。

(2)join(long),join(long, long) 是synchronized method,同步的對象是當前線程實例。

(2)無參版本和兩個參數版本最終都調用了一個參數的版本。

(3) join() 和 join(0) 是等價的,表示一直等下去;join(非0)表示等待一段時間。

從源碼可以看到 join(0)調用了Object.wait(0),其中Object.wait(0)會一直等待,直到被notify/中斷才返回。

while(isAlive())是為了防止子線程偽喚醒(spurious wakeup),只要子線程沒有TERMINATED的,父線程就需要繼續等下去。

(4) join() 和 sleep() 一樣,可以被中斷(被中斷時,會拋出 InterrupptedException 異常);不同的是,join() 內部調用了 wait(),會出讓鎖,而 sleep() 會一直保持鎖。

以本文開頭的代碼為例,我們分析一下代碼邏輯:

調用鏈:Parent.main() -> child.join() -> child.join(0) -> child.wait(0)(此時 Parent線程會獲得 child 實例作為鎖,其他線程可以進入 child.join() ,但不可以進入 child.join(0), 因為child.join(0)是同步方法)。

如果 child 線程是 Active,則調用 child.wait(0)(為了防止子線程 spurious wakeup, 需要將 wait(0) 放入while(isAlive())循環中。

一旦 child 線程不為 Active (狀態為 TERMINATED),child.notifyAll()會被調用-> child.wait(0)返回 -> child.join(0)返回 -> child.join()返回 -> Parent.main()繼續執行, 子線程會調用this.notify(),child.wait(0)會返回到child.join(0) ,child.join(0)會返回到 child.join(), child.join() 會返回到 Parent 父線程,Parent 父線程就可以繼續運行下去了。

3. 對網上其他分析 join() 的文章提出疑問

我覺得網上很多文章的描述有歧義,下面挑選一些描述進行分析,也歡迎大家留言一起討論。

a. 子線程結束之后,'會喚醒主線程',父線程重新獲取cpu執行權,繼續運行。

這里感謝kerwinX的留言,子線程結束后,子線程的this.notifyAll()會被調用,join()返回,父線程只要獲取到鎖和CPU,就可以繼續運行下去了。

b. join() 將幾個并行的線程'合并為一個單線程'執行。

我理解這個說法的意思,但是這樣描述只會讓讀者更難理解。

在調用 join() 方法的程序中,原來的多個線程仍然多個線程,并沒有發生“合并為一個單線程”。真正發生的是調用join() 的線程進入 TIMED_WAITING 狀態,等待 join() 所屬線程運行結束后再繼續運行。

一點感想:技術人員寫作技術文章時,最好盡量避免使用過于口語化的詞匯。

因為這種詞匯歧義比較大,會讓讀者感到更加困惑或形成錯誤的理解。

到此這篇關于Java中Thread.join()的使用方法的文章就介紹到這了,更多相關Java Thread.join()內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产盗摄——sm在线视频| 日韩精品成人在线观看| 欧美另类中文字幕 | 国产精品毛片| 亚洲专区一区| 欧美亚洲色图校园春色| 国产亚洲观看| 日韩av一区二区三区| 国产亚洲字幕| 狠狠久久伊人| 99re国产精品| 欧美日韩xxxx| 国产一区二区三区亚洲| 婷婷综合六月| 亚洲一区导航| 久久av偷拍| 91精品蜜臀一区二区三区在线| 一本一道久久a久久精品蜜桃| 亚洲一区二区免费在线观看| 欧美伊人久久| 日产精品一区二区| 国产精品日本| 91福利精品在线观看| а√天堂8资源在线| 一区久久精品| 国产精区一区二区| 亚洲h色精品| 天堂va欧美ⅴa亚洲va一国产| 精品美女视频 | 日本午夜精品一区二区三区电影| 久久的色偷偷| 91精品1区| 国产亚洲精品美女久久| 日韩成人亚洲| 日韩一区二区三区四区五区| 日韩成人免费| 日韩一区精品| 蜜桃tv一区二区三区| 欧美一级久久| 五月天综合网站| 欧美国产专区| 久久99伊人| 福利视频一区| 日韩有吗在线观看| 亚洲性色av| 欧美精品影院| 亚洲欧美视频| 国产不卡精品在线| 亚洲精品成人一区| 伊伊综合在线| 日本精品一区二区三区在线观看视频| 999精品在线| 久久久精品区| 亚洲精品国产日韩| 日韩毛片在线| 欧美国产视频| 亚洲18在线| 一区二区自拍| 久久精品国产亚洲夜色av网站| 日韩中文字幕| 午夜欧美精品| 久久久精品日韩| 欧美国产日韩电影| 亚洲欧美久久精品| 欧美中文一区二区| 美女视频免费精品| 日本亚洲三级在线| 夜夜嗨一区二区三区| 日韩在线视频精品| 你懂的国产精品永久在线| 亚洲色图国产| 久久国产99| 亚洲激情欧美| 欧美日韩第一| 欧美搞黄网站| 激情久久五月| 久久免费高清| 国产精品久久久久久久久久10秀| 国产日本久久| 欧美日韩中出| 97精品久久| 日韩精品欧美精品| 一区二区亚洲视频| 老牛影视一区二区三区| 亚洲欧洲日本mm| 欧美日韩国产在线观看网站 | 98精品视频| 国内精品亚洲| 国产成人免费精品| 精品三级久久久| 精品国产91| 精品国内亚洲2022精品成人 | 国产午夜一区| 日韩1区2区日韩1区2区| 青草国产精品| 欧美精品二区| av资源亚洲| 99久久夜色精品国产亚洲1000部| 欧美不卡高清一区二区三区| 婷婷激情一区| 激情综合自拍| 亚洲一区欧美二区| 国产一级一区二区| 美日韩精品视频| 男女男精品网站| 免费观看在线综合| 日韩欧美2区| 国产日产精品_国产精品毛片 | 亚洲精品看片| 国产日产一区| 国产中文在线播放| 91精品久久久久久久久久不卡| 欧美在线亚洲| 日韩专区一卡二卡| 亚洲18在线| 九九久久国产| 久久免费黄色| 免费人成在线不卡| 欧美日韩伊人| 国产在线一区不卡| 久久亚洲精品中文字幕蜜潮电影| 亚洲一区日韩在线| 日本成人在线网站| 国产精品第十页| 国产精品字幕| 蜜臀a∨国产成人精品| 91综合久久爱com| 激情久久99| 丝袜诱惑制服诱惑色一区在线观看 | 国产极品模特精品一二| 久久影视三级福利片| 视频福利一区| 日韩三级一区| 天堂av在线| 亚洲免费专区| 国产黄大片在线观看| 久久成人亚洲| 精品三级国产| 久久av一区| 精品国产乱码久久久久久樱花| 婷婷激情综合| 里番精品3d一二三区| 亚洲午夜精品久久久久久app| 日韩一区二区三免费高清在线观看| 麻豆精品视频在线观看视频| 女同性一区二区三区人了人一| 国产日韩欧美一区二区三区在线观看| 三级精品视频| 日韩高清一区二区| 成人羞羞在线观看网站| 亚洲日产av中文字幕| 新版的欧美在线视频| 日韩欧美久久| 久久精品国产大片免费观看| 天堂va欧美ⅴa亚洲va一国产| 桃色av一区二区| 日韩精品亚洲专区在线观看| 久久国产直播| 欧美国产中文高清| 亚洲影院天堂中文av色| www.51av欧美视频| 日韩精品社区| 亚洲中字黄色| 欧美日韩一二三四| 免费在线播放第一区高清av| 国产农村妇女精品一区二区| 日本在线啊啊| 精品一区二区三区四区五区| 影音先锋久久精品| 国产精品字幕| 久久精品天堂| 欧美日韩在线精品一区二区三区激情综合| 激情欧美一区二区三区| 精品视频网站| 国产精品天天看天天狠| 三级亚洲高清视频| 蜜桃tv一区二区三区| 91亚洲一区| 国产精品一级| 午夜电影一区| 蜜桃免费网站一区二区三区| 日韩福利一区| 国产精品蜜芽在线观看| 91精品国产一区二区在线观看 | 国产精品7m凸凹视频分类| 精品亚洲免a| 国产探花一区| 青草国产精品| 日韩高清在线不卡| 午夜视频一区二区在线观看| 午夜在线视频一区二区区别| 91精品啪在线观看国产18 | 国产精品免费精品自在线观看| 亚洲一区二区三区四区电影| 亚洲欧美日韩视频二区| 丝袜美腿一区| 色网在线免费观看| 91亚洲成人| 婷婷亚洲五月| 激情欧美日韩一区|