phaser 的核心价值在于解耦阶段推进与参与者管理,支持动态增减线程、阶段编号驱动同步、自定义阶段切换逻辑及主线程参与协调。

Phaser 的核心价值在于把“阶段推进”和“参与者管理”解耦,让线程同步不再受限于固定人数或单次使用。它不是简单等所有线程到齐就放行,而是通过阶段(phase)编号驱动协作节奏,配合动态注册与注销,自然支撑任务流的弹性伸缩。
阶段同步靠 arriveAndAwaitAdvance()
每个线程在完成当前阶段工作后,必须调用 arriveAndAwaitAdvance() 才算真正“到达”。这个方法会做两件事:一是将自身标记为已到达,二是阻塞等待——直到所有当前已注册的参与者都调用了该方法,Phaser 才自动推进到下一阶段,并唤醒全部等待线程。
注意:阶段编号从 0 开始,首次调用后进入 phase 1,以此类推。线程无需关心具体数字,只需按业务逻辑在每个阶段末尾统一调用即可。
动态调整参与者数量
Phaser 允许运行时增减参与同步的线程,这是它区别于 CyclicBarrier 和 CountDownLatch 的关键:
- 新线程启动时可调用 register() 加入当前阶段及后续阶段
- 批量注册可用 bulkRegister(n),适合预知新增数量的场景
- 线程完成全部任务后应调用 arriveAndDeregister(),既表示到达当前阶段,又立即退出后续同步,避免空等
注册与注销操作是线程安全的,多个线程并发调用不会破坏内部状态。
阶段切换时执行自定义逻辑
重写 onAdvance(int phase, int registeredParties) 方法,就能在每次阶段推进前插入控制逻辑:
- 参数 phase 是即将结束的阶段号(比如 phase=2 表示第 2 阶段刚完成)
- 参数 registeredParties 是下一阶段预计参与的线程数
- 返回 true 表示终止 Phaser,后续 arrive 调用将立即返回负值;返回 false 继续下一阶段
常见用途包括:记录日志、检查中间结果、触发清理动作、或根据条件提前结束整个流程。
主线程也可参与协调
Phaser 不限定谁是“工作线程”,主线程同样可以注册并调用同步方法。例如让主线程作为控制器,先注册自己(new Phaser(1)),再启动子线程并让它们 register();最后主线程在关键节点调用 awaitAdvance(phaser.getPhase()) 等待所有子线程完成某阶段——这种模式便于构建主从式任务编排结构。











