phaser 通过 register/arriveandawaitadvance/deregister 实现动态阶段同步,确保线程按阶段生命周期参与;arriveandawaitadvance() 阻塞等待全员到达并推进 phase,onadvance 可控制流转或终止。

Phaser 任务阶段状态管理的核心,是让阶段推进与参与者生命周期严格对齐。它不靠预设线程数硬编码流程,而是用注册、到达、注销三个动作,把“谁在哪个阶段参与”变成可编程的状态契约。
阶段同步必须用 arriveAndAwaitAdvance(),不是 arrive()
arrive() 只是单向通知完成,不会阻塞;真正实现“等齐再走”的,只有 arriveAndAwaitAdvance()。它会:
- 将调用线程计入当前阶段的到达计数
- 阻塞直到所有当前已注册线程都调用过该方法
- 成功返回后,phase 自动 +1,进入下一阶段
- 返回值就是新 phase 编号(从 0 开始),可用于分支处理,例如:
if (phaser.arriveAndAwaitAdvance() == 2) { /* 第三阶段专属逻辑 */ }
注意:未 register 就调用会抛 IllegalStateException;若某线程中途 deregister,它就不参与该阶段等待——这是动态变化的基础,不是 bug,是设计。
参与者增减要匹配阶段边界
register() 和 arriveAndDeregister() 不影响当前阶段,只作用于下一阶段及以后:
- 阶段 1 正在等待中?此时 register() 新线程,它不会唤醒阶段 1,但会出现在阶段 2 的同步名单里
- 某线程完成阶段 2 后调用 arriveAndDeregister(),它就彻底退出,阶段 3 的 arriveAndAwaitAdvance() 不再等它
- 批量启动可用 bulkRegister(n),比循环 register() 更高效,适合分片任务预分配 worker
典型场景:加载阶段(3 线程)→ 校验阶段(+1 线程)→ 导出阶段(-2 线程)。只需在阶段切换间隙调用对应操作,无需重启 Phaser。
用 onAdvance 控制阶段流转逻辑
onAdvance(int phase, int registeredParties) 是每个阶段结束前的“闸口”,在这里可以决定是否继续:
- 返回 false(默认):正常推进到下一阶段
- 返回 true:终止 Phaser,后续 awaitAdvance() 立即返回,适合自然收尾或异常熔断
- 可做校验,例如:
if (phase == 1 && registeredParties 防止关键阶段人数不足 - 可触发副作用:阶段 0 结束时加载配置,阶段 2 结束时汇总中间结果
该方法在 Phaser 内部锁下执行,避免耗时操作或阻塞调用。
主线程常作协调者,不参与计算
主线程可注册为“观察者”,只负责启动、监听、收尾:
- 构造时 new Phaser(1),自己先注册
- 启动 worker 后,用 awaitAdvance(0) 等待第一阶段结束,再发第二阶段指令
- worker 完成后 deregister,主线程最后调用 arriveAndAwaitAdvance() 或 forceTermination()
这样既保持控制力,又不干扰 worker 的计算节奏。











