簡體   English   中英

在所有其他線程完成后如何在最后運行主線程

[英]how to run main thread at the end after all other threads completed

我想知道thread's join()方法是如何工作的。 我假設當我們在t.join()之后t.start() ,其余的線程可能是main的線程將在線程 t 完成其進程后執行。 當我執行以下代碼時:

public class Run extends Thread {
    void go(){
        System.out.println(isAlive());
    }
    public static void main(String[] args) throws Exception{
        Thread t=new Run();
        t.start();
        //t.join();
        ((Run)t).go();
    }   
}

我可以在輸出中得到truefalse 如果t.start()((Run)t).go() t.start()之前執行,則輸出將為truefalse但我希望輸出始終為true 所以我取消注釋t.join() ,以便main線程的((Run)t).go()在最后執行。 但現在我總是得到輸出為false 我希望這是真的。 任何人都可以清除我的困惑嗎? 我知道我沒有包含 Thread 的run()方法。

https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join--

等待這個線程死亡。

你的程序有兩個線程:主線程和運行實例。 當主線程調用t.join() ,它會等到t死亡,然后繼續。 因此,在Thread.join()返回之后,根據定義,線程將死亡。

我想知道線程的 join() 方法是如何工作的。

這個怎么運作? 或者它有什么作用?

它所做的是, t.join()一直等到線程t死了。 (即,你調用它,直到t死了它才會返回)。

它的工作原理是,它處於一個循環中,測試線程的狀態並在線程尚未死亡時調用t.wait() 線程在死亡時所做的最后一件事是改變它的狀態,然后調用t.notifyAll()

但我想像往常一樣得到輸出true 所以我取消注釋t.join() ,以便主線程的((Run)t).go()在最后執行。

如果希望結果為true ,則需要在檢查時確保線程處於活動狀態; 最直接的方法是從正在運行的線程(即從線程的目標run()方法)進行檢查,但是如果您需要從另一個線程進行檢查,則需要在線程之間創建一個同步機制,例如CountdownLatch . 然后,線程將等待死亡,直到主線程檢查其狀態。

然而,這一切似乎都非常做作。 join()方法等待另一個線程死亡。 如果您在join()成功完成后檢查該線程,您當然會看到它不是活動的。

join() - 等待線程死亡。 enter code here

class JoinDemo{
   Thread thread1 = new Thread(
                 new Runnable() {
                     public void run () {
                         //your code logic goes here
                     }
                  }
    );
    Thread thread2 = new Thread(
                 new Runnable() {
                     public void run () {
                         //your code logic goes here
                     }
                  }
    );
    thread1.start(); //line1
    thread1.join();  //line2
    thread2.start();//line3
}

在這個例子中,有 3 個線程,main、thread1、thread2。 當前正在運行的線程即。 main 會等待 thread1 死亡。thread1 死亡后,它會繼續執行 thread2。 所以主線程只有在線程 1 死后才會進入行 3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM