join()方法使当前线程等待目标线程终止后继续执行,用于实现线程顺序执行;调用a.start()后立即a.join(),再b.start()和b.join(),最后c.start()和c.join(),即可确保a→b→c串行完成。

Java 中用 join() 方法可以让当前线程等待另一个线程执行完毕后再继续,从而实现多个线程的顺序执行。
join 的基本作用
join() 是 Thread 类的方法,调用它会让**当前线程暂停执行**,直到被调用的线程运行结束(即进入 TERMINATED 状态)。它本质上是一种线程同步手段,不涉及锁或共享变量,逻辑清晰、使用简单。
如何用 join 实现顺序执行
假设有三个线程 A、B、C,希望它们按 A → B → C 的顺序依次执行完成(注意:不是并发执行,而是前一个结束,后一个才开始):
- 先启动线程 A
- 在主线程中调用
A.join(),主线程会等 A 结束 - 再启动线程 B,接着调用
B.join() - 最后启动线程 C,再调用
C.join()
这样主线程就“串行等待”了每个子线程,自然实现了顺序执行效果。示例代码片段:
Thread a = new Thread(() -> { System.out.println("A running"); });
Thread b = new Thread(() -> { System.out.println("B running"); });
Thread c = new Thread(() -> { System.out.println("C running"); });
a.start();
try { a.join(); } catch (InterruptedException e) { e.printStackTrace(); }
b.start();
try { b.join(); } catch (InterruptedException e) { e.printStackTrace(); }
c.start();
try { c.join(); } catch (InterruptedException e) { e.printStackTrace(); }
join 的重载版本和注意事项
join() 有三个重载方法:
-
join():无限等待,直到目标线程结束 -
join(long millis):最多等待指定毫秒数,超时后当前线程继续执行 -
join(long millis, int nanos):更精确的超时控制(一般用不到)
注意点:
- 调用
join()不需要持有目标线程的对象锁,也不影响目标线程内部逻辑 - 如果目标线程已被中断(interrupted),
join()可能抛出InterruptedException,必须处理 -
join()只影响调用它的线程,不影响其他线程调度 - 不能在目标线程自身内部调用自己的
join()(会死锁)
和 sleep、wait 的区别
join() 和 Thread.sleep() 都让当前线程暂停,但 sleep() 是固定时间,不关心其他线程状态;而 join() 是条件等待,依赖目标线程生命周期。
与 Object.wait() 不同:wait() 必须在 synchronized 块中调用,且依赖对象监视器;join() 无需同步块,底层其实是基于 wait() 实现的,但封装好了,对用户透明。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











