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

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

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

瀏覽:24日期: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久久,三上悠亚国产精品一区二区三区
日韩欧美中文| 黄色av一区| 中文无码久久精品| 群体交乱之放荡娇妻一区二区| 亚洲国产日韩欧美在线| 亚洲人成网77777色在线播放| 国产麻豆精品| 日韩激情视频网站| 97久久精品| 久久国产精品美女| 国产精品流白浆在线观看| 国产精品欧美大片| 欧美一区久久| 麻豆国产91在线播放| 成人综合一区| 久久久久国产精品一区二区| 宅男在线一区| 亚洲一二av| 日韩在线网址| 国产精品免费大片| sm捆绑调教国产免费网站在线观看| 免费黄网站欧美| 男女精品网站| 日本视频中文字幕一区二区三区| 日韩欧美一区二区三区在线视频 | 精品视频一区二区三区四区五区 | 丝袜脚交一区二区| 午夜国产精品视频免费体验区| 精品美女在线视频| 四季av一区二区凹凸精品| 久久久蜜桃一区二区人| 三级欧美在线一区| 日韩中文字幕| 精品久久久中文字幕| 99久久视频| 日韩一区二区三区在线看| 精品国产一区二区三区噜噜噜| 蜜臀va亚洲va欧美va天堂| 国产精品人人爽人人做我的可爱| 午夜精品成人av| 国产视频一区免费看| 欧美亚洲综合视频| 日韩视频网站在线观看| 久久福利精品| 久久久91麻豆精品国产一区| 亚洲永久av| 视频在线观看一区二区三区| 国产欧美日韩一级| 日韩在线观看不卡| 日韩在线成人| 日韩黄色大片网站| 日韩精品欧美大片| 欧美日韩精品免费观看视欧美高清免费大片 | 欧美在线亚洲| 日韩精品欧美精品| 91日韩在线| 综合激情五月婷婷| 天堂av在线| 日韩av中文在线观看| 人人精品亚洲| 国产欧美久久一区二区三区| 欧美国产91| 精品国产乱码久久久| 丝袜脚交一区二区| 亚洲国产福利| 91午夜精品| 香蕉精品视频在线观看| 久久久久九九精品影院| 日韩一区精品视频| 青青草91久久久久久久久| 中文字幕系列一区| 国产精选久久| 每日更新成人在线视频| 麻豆mv在线观看| 91欧美日韩在线| 日韩一区二区免费看| 国产精品毛片久久| 日本视频在线一区| 久久先锋影音| 久久久久.com| 日本一区二区高清不卡| 奇米色欧美一区二区三区| 五月天激情综合网| 日韩欧美精品| 欧美韩一区二区| 日韩精品一二三区| 久久亚洲精品中文字幕蜜潮电影| 国产一区日韩一区| 国产黄色一区| 日本成人中文字幕| 亚洲视频二区| 91久久在线| 久久亚洲成人| 日韩欧美视频专区| 精品国产一区二区三区av片| 亚洲一区二区三区四区电影| 1000部精品久久久久久久久| 成人在线超碰| 美女视频黄 久久| 日本欧美韩国一区三区| 免费中文字幕日韩欧美| 激情欧美一区| 三级精品视频| 日韩精品诱惑一区?区三区| 美女精品视频在线| 国产日产精品一区二区三区四区的观看方式| 国产精品成人自拍| 一区二区三区午夜视频| 欧美.日韩.国产.一区.二区 | 99国产精品视频免费观看一公开| 日韩网站在线| 精品国产免费人成网站| 成人日韩av| 国产一区二区视频在线看| 国产精品久久久久久av公交车 | 蜜桃视频欧美| 欧美不卡高清一区二区三区| 欧美xxxx中国| 国产精品黑丝在线播放| 老司机精品视频网| 久久激情综合网| 日韩欧美美女在线观看| 免费人成黄页网站在线一区二区| 美女av一区| 国产精品1luya在线播放| 久久国产人妖系列| 日韩三级精品| 欧美日韩1区| 日韩福利在线观看| 日本国产亚洲| 欧美久久香蕉| 国产精品多人| 国产精品二区不卡| 亚洲www免费| 在线一区免费| 亚洲香蕉视频| 日本视频在线一区| 久久99免费视频| 久久久免费人体| 四季av一区二区凹凸精品| 深夜视频一区二区| 夜夜嗨一区二区| 亚洲免费观看高清完整版在线观| 国产白浆在线免费观看| 日韩电影免费网址| 99久久久久| 在线精品亚洲| 欧美另类中文字幕| 久久久久亚洲精品中文字幕| 欧美男人天堂| 在线 亚洲欧美在线综合一区| 免费一级欧美在线观看视频| 国产极品久久久久久久久波多结野| 亚洲深爱激情| 亚洲欧洲日韩精品在线| 国产欧美日韩一级| 日韩三区在线| 蜜臀av一区二区在线免费观看| 日韩av福利| 亚洲精品99| 日韩中文av| 精品精品99| 黄色日韩精品| 欧美欧美黄在线二区| 成人亚洲一区二区| 亚洲在线国产日韩欧美| 日本色综合中文字幕| 国内精品麻豆美女在线播放视频| 亚洲三级在线| 国产精品一区二区三区美女 | 激情欧美一区| 国产精品社区| 国产麻豆精品| 电影亚洲精品噜噜在线观看| 99香蕉国产精品偷在线观看 | 亚洲精品欧美| 欧美激情视频一区二区三区免费 | 蜜桃av一区二区在线观看| 91亚洲无吗| se01亚洲视频| 欧美亚洲自偷自偷| 999国产精品999久久久久久| 久久福利影视| 国产福利片在线观看| 亚洲精华国产欧美| 久久精品国产网站| 久久xxxx| 久久影院午夜精品| 日本中文字幕一区二区视频| 成人日韩av| 国产美女一区| 精品在线网站观看| 男女男精品视频网| 四虎成人av| 日韩高清成人在线| 国产一区二区中文| 精品视频99| 免费精品视频最新在线| 捆绑调教日本一区二区三区| 亚洲精品一区二区在线播放∴|