You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Thread.join方法行为不符合预期,求原因解析

理解Thread.join()的工作逻辑

嘿,我来帮你理清这里的问题~你对join()的核心作用理解有点偏差,咱们一步步拆解:

你的代码里到底发生了什么?

你先执行了t1.start()t2.start(),这两个操作会立即让t1和t2线程进入就绪状态,等待JVM调度执行——也就是说,在你调用t1.join()之前,t2其实已经启动并开始运行了!

接下来的完整流程是这样的:

  1. main线程启动t1,t1开始独立运行
  2. main线程紧接着启动t2,t2也开始独立运行(和t1并行)
  3. main线程调用t1.join():这时main线程会暂停执行,直到t1完全终止才会继续往下走
  4. 当t1结束后,main线程恢复执行,打印"Thread",然后调用t2.join(),等待t2结束
  5. t2结束后,main线程执行完毕退出

所以你看到t1、t2和打印代码并行,是因为t2早就被启动了,join()只是让main线程等待,不会阻止已经启动的其他线程运行,也不会控制其他线程的启动时机。

如何实现“t1执行完再启动t2”?

如果你的预期是t1完全执行结束后,再启动t2,那需要把t2.start()放在t1.join()之后,修改后的代码如下:

public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(new A());
    Thread t2 = new Thread(new B());
    t1.start();
    t1.join(); // 等待t1执行完毕
    t2.start(); // 此时才启动t2
    System.out.println("Thread");
    t2.join();
}

再强调下join()的本质

thread.join()的作用只有一个:让调用这个方法的线程(比如这里的main线程)暂停,直到thread线程执行终止。它不会影响其他已经启动的线程的运行,也不会限制其他线程的启动——其他线程只要调用了start(),就会独立于调用join的线程开始运行。

内容的提问来源于stack exchange,提问作者kaka

火山引擎 最新活动