join()方法使当前线程等待目标线程执行完毕后再继续,属Thread类的同步机制;支持无参阻塞等待和带超时参数的等待,需在start()后调用,可能抛出InterruptedException。

在 Java 中,join() 方法用于让当前线程等待调用该方法的线程执行完毕后再继续运行。它属于 Thread 类,是实现线程同步的一种简单有效方式。
基本用法:无参 join()
调用 thread.join() 会让当前线程(比如主线程)阻塞,直到 thread 完全结束(即 run() 方法执行完成)。
Thread t = new Thread(() -> {
try {
Thread.sleep(2000);
System.out.println("子线程执行完成");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
t.start();
t.join(); // 主线程在此等待 t 执行完
System.out.println("主线程继续执行");
输出顺序一定是:
- “子线程执行完成”
- “主线程继续执行”
带超时的 join(long millis)
如果不想无限等待,可以用带超时参数的版本。当前线程最多等待指定毫秒数,超时后即使目标线程未结束,也会继续向下执行。
立即学习“Java免费学习笔记(深入)”;
- 若目标线程已结束,立即返回
- 若未结束但超时了,当前线程恢复执行
- 若超时期间目标线程结束了,也立即返回
t.start();
t.join(1500); // 最多等 1.5 秒
System.out.println("无论 t 是否结束,这里都会执行");
注意点和常见陷阱
必须在目标线程 start() 之后调用 join(),否则会立即返回(因为线程还没启动)。
join() 可能被中断:如果当前线程在等待时被其他线程调用 interrupt(),会抛出 InterruptedException,需正确处理并恢复中断状态。
- 不要忽略异常,建议捕获后调用
Thread.currentThread().interrupt() - 不能在未启动的线程上调用 join() —— 虽不报错,但无意义
- 多个 join() 可以链式调用,如
t1.join(); t2.join();表示依次等待
与 wait()/notify() 的区别
join() 是 Thread 类提供的高层封装,底层基于 wait() 实现,但你无需手动操作锁或监视器。它专为“等待线程结束”这一场景设计,比直接用 wait()/notify() 更安全、简洁。
不需要 synchronized 块,也不需要关心对象锁 —— 这正是 join() 的便利之处。


















