phaser 的执行模型是阶段推进式同步:线程调用 arriveandawaitadvance() 触发阶段推进,phase 从 0 起每次加 1;参与者数量动态可变,为 0 时自动终止;每阶段可插入业务逻辑,并通过 onadvance() 钩子实现阶段结束时的自定义操作。

Phaser 的执行模型本质是“阶段推进式同步”:每个线程完成当前阶段任务后主动通知(arrive),并等待所有已注册参与者全部到达,之后自动进入下一阶段(advance)。它不依赖固定轮次或预设循环,而是以参与者行为驱动阶段演进。
阶段编号从0开始,每次推进+1
Phaser 内部用一个整数表示当前阶段(phase),初始为 0。调用 arriveAndAwaitAdvance() 是唯一触发阶段推进的操作——当最后一个线程执行该方法时,所有等待线程被唤醒,phase 值加 1,新阶段立即开始。可通过 getPhase() 实时获取当前阶段号,便于做阶段相关判断(如第2阶段才启动汇总逻辑)。
参与者数量决定阶段是否能结束
一个阶段能否结束,取决于“已注册但未注销”的参与者数量。这个数量在运行中可变:
- 构造时传入数字(如
new Phaser(3))相当于初始注册3个 - 运行中调用 register() 可动态增加参与者
- 调用 arriveAndDeregister() 会同时完成到达和注销,减少计数
- 若某阶段只剩0个有效参与者,Phaser 自动终止,后续调用会立即返回
每个 arriveAndAwaitAdvance() 对应一次同步点
这不是一次性屏障,而是按需设置的多个逻辑关卡。例如三阶段任务,就调用三次 arriveAndAwaitAdvance(),每次对应一个同步点:
- 第一次调用后,所有线程从阶段0进入阶段1
- 第二次调用后,统一从阶段1进入阶段2
- 第三次调用后,进入阶段3,依此类推
中间任意阶段都可插入业务逻辑,无需额外控制结构。
onAdvance() 提供阶段结束钩子
重写 onAdvance(int phase, int registeredParties) 方法,可在每个阶段刚结束、新阶段尚未开始时执行自定义操作:
- 返回 false:正常推进到下一阶段
- 返回 true:终止 Phaser,后续调用不再阻塞,直接返回当前 phase
- 适合做数据聚合、资源清理、异常熔断等跨阶段协调动作











