java中实现多线程按序交替执行的核心是线程同步与协作,常用方案包括:①wait/notify配合状态变量和synchronized;②reentrantlock+condition实现精准唤醒;③semaphore控制许可传递;④volatile+自旋适用于轻量场景。

Java 中实现多个线程按顺序交替执行,核心在于**线程间的同步与协作**,常用手段包括 wait/notify、ReentrantLock + Condition、Semaphore、CountDownLatch 或 volatile + 自旋。关键不是“谁先启动”,而是“谁该在何时运行”。下面介绍几种实用、易理解的方案。
用 wait/notify 控制执行权交接
适合两个或多个线程严格轮转(如 A→B→C→A…)。需共享一个锁对象和状态变量(如 int turn = 0 表示轮到第 0 个线程)。
- 每个线程在循环中检查当前状态:若轮到自己,执行任务并更新 turn,调用 notifyAll() 唤醒其他线程
- 若未轮到自己,则调用 wait() 挂起;注意必须在 synchronized 块内调用 wait/notify
- 使用 while 而非 if 判断条件,防止虚假唤醒
⚠️ 注意:notifyAll() 更安全;notify() 可能唤醒错误线程导致死锁。
用 ReentrantLock + Condition 实现精准唤醒
比 wait/notify 更灵活,可为每个线程分配独立的 Condition,避免“唤醒所有再判断”的开销。
- 创建一个 Lock 和多个 Condition(如 conditionA、conditionB、conditionC)
- 线程 A 执行完后 signal(conditionB),只唤醒线程 B;B 执行完 signal(conditionC),依此类推
- 每个线程 await() 前需确保已获得 lock,执行完记得 unlock()
✅ 优势:无虚假唤醒风险,唤醒目标明确,适合三线程及以上精确顺序场景。
用 Semaphore 控制通行令牌
把“执行权”抽象为一个许可(permits),初始只给第一个线程一个 permit,其余设为 0。
- 定义多个 Semaphore:semA = new Semaphore(1), semB = new Semaphore(0), semC = new Semaphore(0)
- 线程 A 执行前 acquire(semA),执行后 release(semB);线程 B acquire(semB) 后 release(semC);以此类推
- 简洁直观,无需显式锁管理,也避免了 wait/notify 的异常处理负担
? 小技巧:可用数组 Semaphore[] sems 统一管理,用 (i+1) % n 控制下一轮目标。
用 volatile + 自旋(适用于简单、低延迟场景)
不推荐高并发或耗时操作,但对学习原理和轻量级控制有帮助。
- 用 volatile int state 标记当前应执行的线程编号(如 0=A, 1=B, 2=C)
- 每个线程 while(state != myIndex) Thread.yield();匹配后执行任务,再 state = (state + 1) % n
- 需配合 yield() 或 short sleep 避免 CPU 空转过热
⚠️ 缺点:浪费 CPU,无法响应中断,仅作理解原理或极简 demo 使用。
实际选型建议:两个线程优先用 wait/notify;三个及以上或要求健壮性,选 ReentrantLock + Condition 或 Semaphore;追求代码简洁且不介意少量许可对象开销,Semaphore 是最易读易维护的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











