日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程神器:join使用及原理

發布時間:2023/12/3 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程神器:join使用及原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?Java多線程神器:join使用及原理




join()

join()是線程類 Thread的方法,官方的說明是:

Waits for this thread to die.

等待這個線程結束,也就是說當前線程等待這個線程結束后再繼續執行,下面來看這個示例就明白了。

示例

public static void main(String[] args) throws Exception {System.out.println("start"); ? ?Thread t = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println(i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();t.join(); ? ?System.out.println("end"); }

結果輸出:

start 0 1 2 3 4 end

線程t開始后,接著加入t.join()方法,t線程里面程序在主線程end輸出之前全部執行完了,說明t.join()阻塞了主線程直到t線程執行完畢。

如果沒有t.join(),end可能會在0~5之間輸出。

join()原理

下面是join()的源碼:

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

可以看出它是利用wait方法來實現的,上面的例子當main方法主線程調用線程t的時候,main方法獲取到了t的對象鎖,而t調用自身wait方法進行阻塞,只要當t結束或者到時間后才會退出,接著喚醒主線程繼續執行。millis為主線程等待t線程最長執行多久,0為永久直到t線程執行結束。


總結

以上是生活随笔為你收集整理的Java多线程神器:join使用及原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。