Phaser 的树状结构通过父子层级解耦组内协同与组间对齐。子 Phaser 完成本组阶段后自动为父 Phaser 调用 arrive(),父 Phaser 的 phase 仅在所有子组同步抵达后才递增,主线程可调用 root.awaitAdvance(n) 等待全局对齐,避免 CAS 竞争与语义混乱。

Phaser 的层次化结构不是为了炫技,而是为了解决大规模动态任务中同步开销和协调混乱的问题。当任务天然分组(比如多个工作节点各自处理一批子任务,再统一汇总),用单个 Phaser 容易因高并发注册/注销引发 CAS 竞争,还难以表达“组内完成 → 组间对齐”这种语义。树状 Phaser 就是为此设计的。
父子 Phaser 的协作逻辑
父 Phaser 不直接管理具体任务线程,它只感知子 Phaser 的“到达”。每个子 Phaser 构造时传入父实例:Phaser group = new Phaser(root)。子 Phaser 自己完成其内部阶段后,会自动为父 Phaser 调用一次 arrive() —— 这个动作不可见,但它是整个层级推进的关键。
- 子 Phaser 的
getPhase()反映本组内部进度,例如阶段 2 表示该组已完成预处理、校验、转换三步 - 父 Phaser 的
getPhase()只在所有子 Phaser 都抵达同一阶段后才递增,代表“全局对齐点” - 主线程调用
root.awaitAdvance(1),等效于等待所有子组都完成第 1 阶段(如全部加载完毕),无需轮询或计数
典型分组场景的构建方式
假设一个分布式计算任务包含 4 个地理区域,每个区域有若干 worker 并行拉取并清洗数据,最后由中心服务聚合结果:
- 创建顶层
Phaser root = new Phaser() - 为每个区域新建子 Phaser:
Phaser regionA = new Phaser(root),同理 regionB/C/D - 每个 region 内部 worker 启动后先调用
regionA.register(),完成本地阶段后调用regionA.arriveAndAwaitAdvance() - 当 regionA 到达阶段 2,它自动触发
root.arrive();只有 A/B/C/D 全部到达阶段 2,root.getPhase()才变为 2
避免常见误用
层次结构一旦建立,就不要混用层级方法:
- 子 Phaser 的线程不能直接调用父 Phaser 的
arrive()或awaitAdvance(),否则破坏分组语义 - 不要让 worker 同时注册到父和子 Phaser——它属于某组,就只归属该子 Phaser
- 子 Phaser 终止(如
onAdvance()返回 true)不会自动终止父 Phaser,但父 Phaser 终止会级联终止所有子 Phaser - 调试时可用
root.getRegisteredParties()查看当前有多少子组已注册,用regionA.getArrivedParties()查看本组完成数
树形结构把“组内协同”和“组间对齐”解耦,既降低单点竞争,又让代码意图更清晰。不复杂但容易忽略。

















