一、核心定位
Thread.join() 是 Thread 类的实例方法,核心作用是实现线程间的同步(等待机制):当一个线程(如主线程)调用另一个目标线程(如子线程)的 join() 方法时,调用线程会进入阻塞状态,直到目标线程执行完毕(进入 TERMINATED 状态)或等待超时,才会继续执行自身后续代码。
简单说:A.join() 让「当前线程」等「线程 A」执行完,再继续自己的工作。
二、重载方法
Java 提供了 3 个重载的 join() 方法,满足不同等待需求:
| 方法签名 | 功能说明 |
|---|---|
void join() throws InterruptedException | 无参重载:无限等待,调用线程会一直阻塞,直到目标线程完全执行终止(不会主动超时) |
void join(long millis) throws InterruptedException | 带毫秒参数:超时等待,调用线程最多阻塞 millis 毫秒(千分之一秒),超时后自动唤醒继续执行 |
void join(long millis, int nanos) throws InterruptedException | 带毫秒 + 纳秒参数:高精度超时等待,理论上支持纳秒级精度,但实际受操作系统时钟精度限制(一般无需使用,优先用毫秒重载) |
关键说明
join(0)等价于join():表示「无限等待目标线程终止」,并非等待 0 毫秒。- 纳秒参数(
nanos)取值范围:0-999999,超出该范围会抛出IllegalArgumentException。 - 所有重载方法均会抛出
InterruptedException(受检异常),必须捕获或声明抛出(因为等待中的线程可能被其他线程中断)。
三、工作原理
1. 核心逻辑
当线程 T1 调用线程 T2.join() 时,底层执行流程如下:
T1(调用线程)会先判断T2(目标线程)是否还处于存活状态(isAlive());- 若
T2仍存活,T1会调用Object.wait()方法(底层依赖 Object 的等待机制),进入阻塞状态; - 当
T2执行完毕终止时,JVM 会自动调用T2的notifyAll()方法,唤醒所有等待在T2对象上的线程(即T1); - 若设置了超时时间,
T1在等待超时后会自动唤醒,无需T2终止。
2. 与 Thread.sleep() 的核心区别
很多人会混淆 join() 和 sleep(),二者的核心差异在于锁释放和使用场景:
| 特性 |
|---|

