Thread.join方法行为不符合预期,求原因解析
理解Thread.join()的工作逻辑
嘿,我来帮你理清这里的问题~你对join()的核心作用理解有点偏差,咱们一步步拆解:
你的代码里到底发生了什么?
你先执行了t1.start()和t2.start(),这两个操作会立即让t1和t2线程进入就绪状态,等待JVM调度执行——也就是说,在你调用t1.join()之前,t2其实已经启动并开始运行了!
接下来的完整流程是这样的:
- main线程启动t1,t1开始独立运行
- main线程紧接着启动t2,t2也开始独立运行(和t1并行)
- main线程调用
t1.join():这时main线程会暂停执行,直到t1完全终止才会继续往下走 - 当t1结束后,main线程恢复执行,打印
"Thread",然后调用t2.join(),等待t2结束 - 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




