繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM