本文主要是介绍多线程-并发:介绍Phaser,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
接上一篇。多线程-并发:介绍CyclicBarrier
我们继续聊《天龙八部》四大恶人。
大家都知道,叶二娘是虚竹的娘,少室山一战玄慈方丈和叶二娘都领了便当。从此四大恶人就剩了三个。
大家也都知道,小说接近尾声,段誉身份解开前后,岳老三被段延庆捅了个透心凉领了便当;云中鹤因为中了悲酥清风,被前来救援的大理臣子收了人头。从此四大恶人就剩了一个。
当我们纵观整个四大恶人(四个线程),发现他们:
①多阶段协同,但阶段的参与数可变!因此在使用CyclicBarrier不好实现了。
②假定第一阶段4个,第二阶段3个,第三阶段1个。
这时,就需要我们有新的编程利器:Phaser(阶段协同器,也被称为相位器)
简介:
java7中增加的用于多阶段同步控制的工具类,它包含了CyclicBarrier和CountDownLatch的相关功能,比他们更加强大灵活。
多个线程写作执行的任务分为多个阶段,每个阶段都可以有任意个参与者,线程可以随时注册并参与到某个阶段;当一个阶段中所有的任务都被完成成功之后,Phaser的OnAdvance()被调用(类似循环屏障的使用的Runnable接口,可以通过覆盖添加自定义处理逻辑),然后Phaser释放等待线程,自动进入下个阶段。如此循环,直到Phaser不再包含任何参与者。
//注意!
//单个Phaser示例允许的注册任务数上限65535,如果参与任务数操作,可用父子Phaser树的方式
public class Phaser {//构造方法//参与任务数为0public Phaser() {...}//制定初始参与任务数//public Phaser(int parties) {...}//指定父容器。子对象整体作为一个参与者加入到父对象,当子对象中没有参与者时,自动从父对象解除注册public Phaser(Phaser parent) {...}public Phaser(Phaser parent, int parties) {...}//增减参与任务数方法//增加一个数,返回当前阶段号public int register() {...}//增加指定个数,返回当前阶段号public int bulkRegister(int parties) {...}//减少一个任务数,返回当前阶段号public int arriveAndDeregister() {...}//到达、等待方法//到达(任务完成),返回当前阶段号public int arrive() {...}//到达后等待其他任务到达,返回到达阶段号public int arriveAndAwaitAdvance() {...}//在指定阶段等待(必须是当前阶段才有效)public int awaitAdvance(int phase) {...}public int awaitAdvanceInterruptibly(int phase){...}public int awaitAdvanceInterruptibly(int phase,long timeout, TimeUnit unit){...}//阶段到达触发动作//类似CyclicBarrier触发命令,通过重写该方法来增加阶段到达动作,该方法返回true将终结Phaser对象protected boolean onAdvance(int phase, int registeredParties) {...}//其他API//强制结束public void forceTermination() {...}//获取当前阶段号public final int getPhase() {...}//判断是否结束public boolean isTerminated() {...}}
如图:
好了,在最后,我们总结以下CountDownLatch、CyclicBarrier、Phaser的使用:
1.等待N个条件到达:CountDownLatch、Phaser
2.等待一起出发:CountDownLatch、CyclicBarrier、Phaser
3.不变参与数,多阶段等待一起出发:CyclicBarrier、Phaser
4.可变参与数,多阶段等待一起出发:Phaser
这篇关于多线程-并发:介绍Phaser的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!