Phaser 通过分离阶段推进与参与者管理实现动态多线程协作:阶段由 arriveAndAwaitAdvance() 自动触发并同步,参与者可运行时 register/arriveAndDeregister,onAdvance() 统一控制阶段流转,支持分层嵌套。

Phaser 通过把“阶段推进”和“参与者管理”彻底分开,让多线程协作不再依赖固定人数或预设流程,从而显著降低程序设计复杂度。
阶段推进由到达行为自然触发
不需要提前约定总线程数,也不用等待所有线程启动完毕才开始同步。只要每个线程调用 arriveAndAwaitAdvance(),就表示它已完成当前阶段并准备进入下一阶段。Phaser 自动统计已到达的线程,等全部注册参与者都到达后,phase +1,所有线程同时被唤醒——这个过程完全隐式、无需手动计数或重置。
- 调用一次 arriveAndAwaitAdvance() 就完成“上报+等待”两件事
- 返回值是下一阶段编号(从 0 开始),可直接用于分支逻辑,比如
if (phaser.arriveAndAwaitAdvance() == 2) { /* 第三阶段操作 */ } - 仅调用 arrive() 不会阻塞,适合监控线程、日志线程等只上报不参与同步的角色
参与者可运行时动态调整
线程加入或退出完全按需发生,不绑定阶段生命周期。新线程随时 register(),退出时用 arriveAndDeregister() 原子完成“到达+注销”,避免状态错乱。
- 构造时传参(如
new Phaser(3))只是初始化计数器,不代表已有 3 个有效参与者 - 每个工作线程必须在执行任务前显式 register(),否则调用 arriveAndAwaitAdvance() 会抛
IllegalStateException - 阶段性退出(如某组 worker 完成 map 后不再参与 reduce)用 arriveAndDeregister(),比手动维护多个屏障更安全
阶段流转逻辑集中可控
所有阶段切换前统一经过 onAdvance(int phase, int registeredParties) 方法,业务判断和清理动作都在这里收口。
立即学习“Java免费学习笔记(深入)”;
- 返回 false(默认)继续下一阶段;返回 true 终止 Phaser,适合任务自然结束或异常熔断
- 参数
registeredParties是下一阶段预计参与数,可用于判断是否还有活跃任务 - 常见用途包括:校验中间结果、写入阶段快照、释放临时资源、记录耗时统计
天然支持分层与嵌套协同
当任务存在逻辑分组(如多个 worker 组并行处理,再统一汇总),平铺在一个 Phaser 下会导致阶段语义模糊。此时可用父子 Phaser 结构:子 Phaser 管理组内同步,父 Phaser 协调组间节奏。
- 子 Phaser 构造时传入父 Phaser 实例,自动继承其阶段状态
- 父 Phaser 的 onAdvance() 可根据子 Phaser 的完成情况决定是否推进
- 避免为不同粒度的同步点维护多套独立屏障,减少对象泄漏与状态管理负担


















