本文代码基于Java8
前言
Phaser
移相器是一个可重用的同步屏障,功能上与 CyclicBarrier
和 CountDownLatch
类似,但是支持更灵活的使用,用来解决控制多个线程分阶段共同完成任务的情景问题。
Phaser类结构
1 | public class Phaser { |
构造函数
创建具有父 Phaser 和参与数的新 Phaser。当给定的父 Phaser 非空且给定的参与数大于零时,该子 Phaser 将注册到其父 Phaser。
1 | /** |
使用示例
Phaser
替代 CyclicBarrier
比较简单,CyclicBarrier
的 await()
方法可以直接用 Phaser
的arriveAndAwaitAdvance()
方法替代。CyclicBarrier
只适用于固定数量的参与者,而 Phaser
适用于可变数目的屏障。
1 | public class PhaserDemo { |
常用方法
phaser.getPhase()
初始值为0,如果全部线程执行完则+1,如果 phaser.getPhase()
达到 Integer 的最大值,这重新清空为0。phaser.arriveAndDeregister()
表示线程到达后离开。phaser.arriveAndAwaitAdvance()
表示线程在等待其他线程。phaser.bulkRegister(friendNum)
表示临时加进来几个线程。
这些方法的具体实现相对复杂,了解这些方法的作用会熟练使用即可。
有个例子很好的解释了这些方法的作用,更多可以参考 java多线程之Phaser。
假如有这么一个场景,在旅游过程中,有可能很凑巧遇到几个朋友,然后他们听说你们在旅游,所以想要加入一起继续接下来的旅游。也有可能,在旅游过程中,突然其中有某几个人临时有事,想退出这次旅游了。在自由行的旅游,这是很常见的一些事情。如果现在我们使用 CyclicBarrier 这个类来实现,我们发现是实现不了,但是用Phaser就可实现这个功能。
旅游类 TourismRunnable:
1 | import java.util.Random; |
测试代码:
1 | import java.util.ArrayList; |
运行结果:
1 | 小刚:突然有事要离开一下,不和他们继续旅游了.... |