Java中join()方法的作用是让当前线程阻塞等待指定线程执行完毕后再继续运行,实现主线程等待子线程结束的同步控制;它是Thread类的实例方法,需在子线程start()后调用,支持无参、限时等待等重载形式,并可能抛出InterruptedException。

Java 中 join() 方法的作用是让当前线程(通常是主线程)**阻塞等待**指定线程执行完毕后再继续运行,从而实现“主线程等子线程结束”的同步控制。
join 的基本用法
join() 是 Thread 类的实例方法,调用它会让当前线程暂停,直到目标线程终止(即 run() 方法执行完成)。最常用的是无参版本:
-
thread.join():无限期等待,直到thread死亡 -
thread.join(long millis):最多等待指定毫秒数,超时后继续执行 -
thread.join(long millis, int nanos):更精细的时间控制(一般少用)
典型使用场景示例
比如主线程启动 3 个子线程处理数据,希望全部完成后才打印汇总结果:
Thread t1 = new Thread(() -> { /* 任务1 */ });
Thread t2 = new Thread(() -> { /* 任务2 */ });
Thread t3 = new Thread(() -> { /* 任务3 */ });
<p>t1.start();
t2.start();
t3.start();</p><p>// 主线程依次等待每个子线程结束
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
}</p><p>System.out.println("所有子线程已完成"); // 这行一定在最后执行
注意 join 的调用位置和线程状态
join() 必须在子线程 start() 之后调用,否则无效;也不能在子线程自己内部调用 this.join(),会导致死锁。
立即学习“Java免费学习笔记(深入)”;
- 如果子线程还没 start 就调用 join,会立即返回(因为线程处于 NEW 状态,尚未运行)
- 如果子线程已结束(TERMINATED),join 也会立即返回
- join 调用期间,当前线程进入 WAITING 状态,释放 CPU,但不释放已持有的锁
与 sleep、wait 的区别要清楚
join() 本质是基于 wait() 实现的,但它封装了线程生命周期判断,比手动 wait/notify 更安全易用。
-
sleep()是让当前线程休眠指定时间,不依赖其他线程状态 -
wait()需要配合 synchronized 和 notify,用于对象锁通信,不是专为线程同步设计 -
join()专为“等待某线程结束”而生,语义明确,无需加锁,推荐优先使用
异常处理不能忽略
join() 可能被中断,抛出 InterruptedException。捕获后应合理响应,常见做法是恢复中断标志:
try {
t.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 关键:保持中断状态
// 或根据业务决定是否提前退出
}
不复杂但容易忽略细节。只要记住:start 后再 join,处理中断,别在子线程里 join 自己。


















