![](/img/trans.png)
[英]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.