[英]how to run the main thread after all child threads have completed there exceution
[英]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();
}
}
我可以在輸出中得到true
或false
。 如果t.start()
在((Run)t).go()
t.start()
之前執行,則輸出將為true
或false
但我希望輸出始終為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.