91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中join有什么用

發布時間:2021-12-14 16:12:14 來源:億速云 閱讀:292 作者:小新 欄目:開發技術

小編給大家分享一下Java中join有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

java多線程里的join,從字面意思來看是聯合,合并的意思,但如果面試時這么回答,基本上可以斷定面試者還沒搞懂。join究竟能干什么,今天給出一個最通俗的解釋,那就是在多線程環境下實現暫時以單線程執行,或者說在并行執行的環境中實現暫時以串行執行。為了說明這個問題,我們看一段再常見不過的代碼,代碼內容是,讓三個線程分布去打印一段內容

//代碼塊1
public class TestJoin {
   public static void main(String[] args) throws InterruptedException {
       Thread t1 = new Thread(new DoSth());
       Thread t2 = new Thread(new DoSth());
       Thread t3 = new Thread(new DoSth());
       t1.start();
       t2.start();
       t3.start();
       System.out.println("主線程執行");
   }
}

class DoSth implements Runnable {
   @Override
   public void run() {
       int n = 5;
       while (n > 0) {
           System.out.println(Thread.currentThread().getName());
           try {
               Thread.sleep(1);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
           n--;
       }
   }
}

執行結果如下:

線程1執行
線程2執行
線程3執行
線程2執行
線程3執行
線程1執行
線程2執行
線程3執行
線程2執行
線程3執行
線程2執行
線程3執行
線程1執行
線程1執行
線程1執行

可見三個線程各自并行執行,并無明確的先后順序。但如果我們在t.start()后面加上這行代碼,

//代碼塊2
t1.start();
t1.join();

看會出現看什么樣的結果:

線程1執行
線程1執行
線程1執行
線程1執行
線程1執行
線程2執行
線程3執行
線程3執行
線程2執行
線程3執行
線程2執行
線程3執行
線程2執行
線程3執行
線程2執行

可以看到線程1執行結束之后線程2和3才開始執行,可見在線程1執行過程中,其他線程并未執行,線程1結束后,線程2,線程3開始并行執行,這就印證了前面的結論,即:join的作用是在多線程環境下暫時以單線程執行。明白了這一點,接下來的問題是,這個特性是怎么實現的呢?我們跟到源碼:可以看到

//代碼塊3

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

}

在第12行調用了wait,注意這里的wait,它并不是指線程線程1對象執行wait,而是線程1的調用者,也就是相當于在主線程去執行wait,可等價理解為以下偽代碼:

t1.start();
while(t1.isAlive()){
   Thread.currentThread().doWait()
}

此時執行流程會在代碼塊3的11-13行循環執行,當線程1執行完畢時,其生命周期結束,isAlive()返回false,11-13行退出循環,繼續執行下面的代碼,此時又切換為并行執行狀態。對于以上執行效果,我們完全可以不用創建t1線程,而是把在主線程中直接去調用t1的核心邏輯,代碼如下:

public static void main(String[] args) throws InterruptedException {
   //Thread t1 = new Thread(new DoSth(), "線程1");
   Thread t2 = new Thread(new DoSth(), "線程2");
   Thread t3 = new Thread(new DoSth(), "線程3");
   //t1.start();
   //t1.join();
   new DoSth().run();//直接調用業務邏輯,而不是分配線程去執行
   t2.start();
   t3.start();
   System.out.println("主線程執行");
}

和之前的代碼相比,本來需要在子線程t1中執行的內容,通過在主線程中執行達到了相同的效果,而這種特性,就體現了所謂的join,現在你明白為什么叫join了吧?join在實際應用當中有什么用呢?把以上代碼改造一下,用一個例子來說明。

public static void main(String[] args) throws InterruptedException {
   Thread t1 = new Thread(new DoSth(), "小組1");
   Thread t2 = new Thread(new DoSth(), "小組2");
   Thread t3 = new Thread(new DoSth(), "小組3");
   t1.start();
   t2.start();
   t3.start();
   t1.join();
   t2.join();
   t3.join();
   System.out.println("集合完畢");
}

執行結果:

小組3正在集合
小組1正在集合
小組2正在集合
小組3正在集合
小組1正在集合
小組2正在集合
小組3正在集合
小組1正在集合
集合完畢

當我們需要多個子線程分布去完成各自的任務,并在這些子線程全部完成后,主線程做統一匯總時,join就派上用場了。不過細心的讀者會發現,這些子線程并未返回任何結果,如果我們需要返回結果供主線程使用時,該怎么實現,針對這一需求,單靠實現Runnable的方式已經無法做到了,此時需要用到另外的接口:Feature和Callable。

以上是“Java中join有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

同心县| 松阳县| 景宁| 佛坪县| 仪陇县| 胶南市| 黎城县| 天全县| 珲春市| 奇台县| 霍林郭勒市| 达拉特旗| 肥东县| 澄江县| 伽师县| 上高县| 诸城市| 丰顺县| 雷州市| 张掖市| 托克托县| 瓦房店市| 乐清市| 轮台县| 会同县| 宜都市| 玉溪市| 夏津县| 仁化县| 宁阳县| 达拉特旗| 普兰县| 汉源县| 高碑店市| 苗栗县| 竹北市| 苏尼特左旗| 滦平县| 绵阳市| 三河市| 凤阳县|