运行分为多阶段的任务:Phaser类
在并发 API 中,最重要的因素就是它为编程人员提供的同步机制。
同步是指为获得预期结果而对两个或多个任务进行的协调。
当两个或多个任务按预定顺序执行时,可以对其执行进行同步;或是当一次只有一个线程可以执行某个代码段或者修改某个内存区域时,可以同步两个或多个任务对共享资源的访问。
Java 9 并发 API 提供了大量同步机制,从基本的 synchronized 关键字和 Lock 接口以及它们用于保护临界段的具体实现,到更高级的 CyclicBarrier 类和 CountDownLatch 类,支持同步不同任务的执行顺序。
在 Java 7 中,并发 API 引入了 Phaser 类。该类提供了一种强大的机制(分段器),将任务划分为多个阶段执行。
任务可以要求 Phaser 类等待直到所有其他参与方完成该阶段。
基本内容
小结
-
介绍了 Java 并发 API 提供的最强大的同步机制之一:分段器。
它的主要目的是为执行分为多阶段的算法的任务提供同步。
在所有任务都完成上一阶段之前,任何任务都不能开始执行下一阶段。 - 分段器必须知道任务要进行同步的任务数量。
必须使用构造函数
、bulkRegister()
方法或register()
方法在分段器中注册任务。 - 分段器可以以不同方式同步任务。
arriveAndAwaitAdvance()
方法告诉分段器,任务已经完成了一个阶段的执行,要继续执行下一阶段。
该方法将休眠该线程直到剩下的任务都完成当前阶段为止。arrive()
方法用于通知分段器当前阶段已经完成,但是不会等待剩下的任务(使用该方法时要非常小心)。arriveAndDeregister()
方法用于告知分段器当前阶段已经完成,而且并不想在分段器中继续等待(通常是因为已经完成了任务)。awaitAdvance()
方法可用于等待当前阶段结束。
- 通过使用
onAdvance()
方法,可以控制阶段变化,并且在所有任务都完成当前阶段且准备开始新阶段时执行代码。
该方法在两个阶段执行的间隙被调用,并且接收阶段的编号和参与者在分段器中的编号作为参数。
可以扩展 Phaser 类,并且重载该方法以在两个阶段之间执行代码。 - 分段器可以处于活动和终止两种状态。
同步任务时进入活动状态;完成自己的工作时进入终止状态。
所有参与方调用arriveAndDeregister()
方法时或者onAdvance()
方法返回true
值(默认情况下,总是返回false
)时,分段器将进入终止状态。
当 Phaser 类处于终止状态时,它不再接收新的参与方,而且同步方法将立即返回。