CodeWalk

Thread.join()的内部实现原理

作者:Yahuda · 2026-05-30 12:55

请解释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;
        }
    }
}

关键点

  1. join()是synchronized方法,锁对象是被join的线程实例。
  2. 内部调用wait(0)使主线程进入WAITING状态。
  3. 被join线程执行完毕后,JVM自动调用this.notifyAll()(线程退出时调用)。
  4. join(timeout):带超时等待,超时后无论线程是否存活都返回。

注意

  • join()依赖wait/notify机制,因此被join线程结束后自动唤醒。
  • join(0)等同于join(),无限等待。
  • 线程退出时JVM在native层调用notifyAll(),这是JVM规范的实现细节。