JUC--设计模式_join原理

JUC–join原理

  • JUC–join原理

  • 博主以黑马JUC进行学习

定义

  • 标准定义

    join() 是线程对象的方法,调用方线程会阻塞暂停,直到被调用的目标线程完全执行完毕、终止退出,调用方线程才会恢复执行。

  • 核心作用

    解决多线程执行顺序不可控的问题,强制实现线程串行依赖,保证业务逻辑的先后顺序。

  • 设计模式定位

    属于并发设计模式中的同步模式,是实现「生产者 - 消费者」「两阶段终止」「线程池任务等待」等设计模式的底层依赖。

底层实现原理(JDK 源码核心)

Java 中 Thread.join() 的底层是基于 Object.wait() / notifyAll() 的等待 - 通知机制,伪代码逻辑:

1
2
3
4
5
6
7
8
// Thread.join() 底层简化源码
public final synchronized void join() throws InterruptedException {
// 循环判断目标线程是否存活
while (isAlive()) {
// 调用方线程阻塞等待(释放锁)
wait(0);
}
}

关键机制:

  1. 加锁join() 是同步方法,锁为目标线程对象本身
  2. 阻塞:调用方线程进入 wait() 状态,释放锁,暂停执行;
  3. 唤醒:JVM 在目标线程执行完毕、终止退出时,会自动调用 notifyAll() 唤醒所有等待该线程的线程;
  4. 退出:唤醒后再次检查线程状态,确认终止后,join() 方法返回,调用方恢复执行。

核心特性

  • 阻塞性:调用 join() 的线程会完全阻塞,不占用 CPU 资源;
  • 等待终止:必须等目标线程彻底运行结束才会放行,不是等待某一步执行;
  • 可超时:支持 join(long millis),超时后自动放行,避免无限等待;
  • 可中断:等待中的线程可以被 interrupt() 中断,抛出中断异常;
  • 无锁竞争优化:底层基于 JVM 原生等待通知,无用户态锁竞争,性能高效。