Java Thread.join:在多个线程上调用join时的行为是什么

时间:2017-12-16 16:12:03

标签: java multithreading concurrency

以下是一些示例代码。类MyRunnable只打印"线程x开始",并且有一个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。

问题:上面的代码中发生了什么(从运行时的角度来看)?执行的顺序是什么?

谢谢

2 个答案:

答案 0 :(得分:1)

当你start线程时,JVM会安排它们执行。此时,他们和创建它们的线程都在CPU核心上竞争运行时。没有预定义的顺序,他们将获得该运行时,如果有足够的内核,它们可能都会并行运行。

  

我期待t1-> t2-> t3是终止的顺序

不一定。您的join将按顺序完成,这意味着调用线程将等到它看到t1已终止,然后等到它看到t2已终止,然后等到它看到{ {1}}已经终止;但那只是你检查(并在必要时等待)。它们可以以任何顺序运行和完成。

将自己想象成一扇有三扇门的走廊。每扇门后面都是一个带笔记本的人。你沿着走廊走,敲门。这告诉每个人用笔记本在笔记本上写东西。然后你打开第一扇门:如果这个人写完了,你就转到隔壁;如果没有,你等到它们完成然后继续前进。然后你用第二扇门做,然后用第三扇门做。人们可能会以任何顺序完成写作,但你按顺序检查了它们:第一,第二,第三。

答案 1 :(得分:0)

大多数时候,这些名字非常重要且不言自明; 发生的事情是调用线程等到:

1.线程t1加入

2.线程t2加入

3.线程t3加入它。

在这些加入呼叫返回之后,任何事情都会被执行。 存在其他形式的join(),其中我们指定了我们想要等待给定线程终止的最大时间量。

线程(t1,t2,t3)当然可以按不同顺序完成,不能保证终止顺序。这似乎是合乎逻辑的,因为他们可能正在做不同时间复杂度的不同任务。

已经讨论过Java Multithreading concept and join() method