Java Thread.join : what is the behaviour when calling join on multiple threads

标签 java multithreading concurrency

这是一些示例代码。 MyRunnable 类仅打印“Thread x started”,并具有 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将强制程序等待线程完成。因此,在阅读程序时,我期望 t1->t2->t3 是终止的顺序。但是,我同时终止了 t1、t2 和 t3。

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

谢谢

最佳答案

当您启动线程时,JVM 会安排它们执行。此时,它们和创建它们的线程都会争夺 CPU 核心上的运行时间。它们获取运行时的顺序没有预定义,如果有足够的核心可用,它们可以并行运行。

I'm expecting t1->t2->t3 to be the order of terminations

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

想象自己在一个有三扇门的走廊里。每扇门后面都有一个拿着笔记本的人。你沿着走廊走,敲每一扇门。这告诉每个拥有笔记本的人在笔记本上写一些东西。然后你打开第一扇门:如果这个人写完了,你就去下一扇门;如果对方写完了,你就去下一扇门;如果对方写完了,你就去下一扇门。如果没有,你就等到他们完成然后继续。然后你对第二扇门进行同样的操作,然后是第三扇门。人们可能会以任何顺序完成写作,但你按顺序检查他们:第一,第二,第三。

关于Java Thread.join : what is the behaviour when calling join on multiple threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47847595/

相关文章:

java - recyclerview inside nestedscrollview addOnScrollListener (endless scrolllistener)

java - 在更改所选操作选项卡之前添加确认操作对话框?

java - Jira:线程安全的小工具数据?

c# - 在 HttpModule 中正确使用 ConcurrentQueue?

java - 为什么 Map.of 不允许空键和值?

java - Spring Data MongoDB 排序性能

java - java中两个线程之间共享数据

android - Sugar ORM 在初始化时阻塞 UI 线程

java - 我可以在这个程序中实现线程以使其更快吗?

java - 未知的并发修改异常java使用Iterator和Vector