Phaser 类简介

Phaser 类是一种同步机制,用于控制以并发方式划分为多个阶段的算法的执行。
如果处理过程已有明确定义的步骤,那么必须在开始第二个步骤之前完成第一步的工作,以此类推,并且可以使用 Phaser 类实现该过程的并发版本。

Phaser 类的主要特征有以下几点。

参与者的注册与注销

一个分段器必须知道其控制的任务数目,必须知道正在执行划分为多个阶段的算法的不同线程数目,以便正确控制同时发生的阶段变更。
Java 将此过程称作参与者的注册。

正常情况下,参与者在执行开始时注册,但是也可以随时注册。

可以采用不同方式注册参与者,如下所示。

分段器控制的任务完成执行时,必须从分段器注销。
如果不这样做,分段器就会在下一阶段变更中一直等待该任务。

注销一个参与者,可以使用 arriveAndDeregister() 方法。
使用该方法告知分段器该任务已经完成了当前阶段,而且不再参与下一阶段。

同步阶段变更

分段器的主要目的是使那些可以分割成多个阶段的算法以并发方式执行。
所有任务完成当前阶段之前,任何任务都不能进入下一阶段。

Phaser 类提供了 arrive()arriveAndDeregister()arriveAndAwaitAdvance() 三个方法通报任务已经完成当前阶段。
如果其中某个任务没有调用上述三个方法之一,那么分段器对其他参与任务的阻塞是不确定的。

继续进入下一阶段需要用到下述方法。

其他功能

在所有参与任务都完成了某个阶段的执行之后,在继续下一阶段之前, Phaser 类执行 onAdvance() 方法。
该方法接收如下两个参数。

如果想在两个阶段之间执行一些代码,例如,对某些数据进行排序或者转换,那么可以扩展 Phaser 类并重载该方法以实现自己的分段器。

分段器可以有以下两种状态。

获取分段器状态和其中参与者的信息

Phaser 类提供了一些方法,获取分段器状态和其中参与者的信息。