![](/img/trans.png)
[英]Main not waiting for threads even after using Thread.join() in Java
[英]Java Thread.join : what is the behaviour when calling join on multiple threads
这是一些示例代码。 MyRunnable
类仅打印“ Thread x MyRunnable
”,并具有Thread.sleep(4000)。 剩下的对我的问题并不重要。 以下代码在另一个类中:
Thread t1 = new Thread(new MyRunnable, "t1");
Thread t2 = new Thread(new MyRunnable, "t2");
Thread t3 = new Thread(new MyRunnable, "t3");
t1.start(); t2.start(); t3.start();
try {
t1.join();
t2.join();
t3.join();
} catch(InterruptedException e) {
...
我知道join
将迫使程序等待直到this
线程完成。 因此,在阅读程序时,我期望t1-> t2-> t3是终止的顺序。 但是,我同时终止了t1,t2和t3。
问题:上面的代码(从运行时角度)发生了什么? 执行顺序是什么?
谢谢
当start
线程时,JVM调度它们以供执行。 那时,它们和创建它们的线程都争夺CPU内核上的运行时。 它们没有获得运行时的预定义顺序,如果有足够的内核可用,它们可能会全部并行运行。
我期望t1-> t2-> t3是终止的顺序
不必要。 您的join
将按顺序完成,这意味着调用线程将等待,直到看到t1
终止,然后再等待直到看到t2
终止,然后再等待直到看到t3
终止; 但这只是您检查(并在必要时等待)。 它们可以按任何顺序运行和完成。
想象自己在三扇门的走廊里。 每个门的后面都是一个有笔记本的人。 您沿着走廊走,敲开每扇门。 这告诉每个有笔记本的人在笔记本上写东西。 然后,您打开第一扇门:如果此人完成了写作,则继续前进到下一扇门。 如果没有,请等到它们完成后再继续。 然后,您用第二扇门,然后是第三扇门。 人们可以按任何顺序完成写作,但是您按顺序检查了他们:第一,第二,第三。
在大多数情况下,名称非常重要且不言自明。 发生的情况是调用线程等待直到:
1,线程t1加入
2.线程t2加入
3.线程t3将其加入。
在这些联接调用返回之前,将不会执行任何后续操作。 还有其他形式的join(),其中我们指定了等待给定线程终止的最长时间。
线程(t1,t2,t3)当然可以以不同的顺序完成,不能保证终止的顺序。 这似乎合乎逻辑,因为他们可能会执行不同时间复杂度的不同任务。
已经进行了很好的讨论,请参阅Java Multithreading概念和join()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.