Thread.join()的内部实现原理
请解释Thread.join()的内部实现原理,以及join(timeout)与无参join()的区别。
回答
Yahuda
join()原理:
- join()方法的实现本质上是调用当前线程对象(被join的线程)的wait()方法。
- 当前线程(主线程)等待被join线程(t)执行完毕。
源码核心:
public final synchronized void join(long millis) throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) throw new IllegalArgumentException();
if (millis == 0) {
while (isAlive()) wait(0);
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) break;
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
关键点:
- join()是synchronized方法,锁对象是被join的线程实例。
- 内部调用wait(0)使主线程进入WAITING状态。
- 被join线程执行完毕后,JVM自动调用this.notifyAll()(线程退出时调用)。
- join(timeout):带超时等待,超时后无论线程是否存活都返回。
注意:
- join()依赖wait/notify机制,因此被join线程结束后自动唤醒。
- join(0)等同于join(),无限等待。
- 线程退出时JVM在native层调用notifyAll(),这是JVM规范的实现细节。