多线程-并发:介绍Phaser

接上一篇。多线程-并发:介绍CyclicBarrier

我们继续聊《天龙八部》四大恶人。

大家都知道,叶二娘是虚竹的娘,少室山一战玄慈方丈和叶二娘都领了便当。从此四大恶人就剩了三个。

大家也都知道,小说接近尾声,段誉身份解开前后,岳老三被段延庆捅了个透心凉领了便当;云中鹤因为中了悲酥清风,被前来救援的大理臣子收了人头。从此四大恶人就剩了一个。

当我们纵观整个四大恶人(四个线程),发现他们:

①多阶段协同,但阶段的参与数可变!因此在使用CyclicBarrier不好实现了。

②假定第一阶段4个,第二阶段3个,第三阶段1个。

这时,就需要我们有新的编程利器:Phaser(阶段协同器,也被称为相位器)

简介:

java7中增加的用于多阶段同步控制的工具类,它包含了CyclicBarrier和CountDownLatch的相关功能,比他们更加强大灵活。

多个线程写作执行的任务分为多个阶段,每个阶段都可以有任意个参与者,线程可以随时注册并参与到某个阶段;当一个阶段中所有的任务都被完成成功之后,Phaser的OnAdvance()被调用(类似循环屏障的使用的Runnable接口,可以通过覆盖添加自定义处理逻辑),然后Phaser释放等待线程,自动进入下个阶段。如此循环,直到Phaser不再包含任何参与者。

//注意!
//单个Phaser示例允许的注册任务数上限65535,如果参与任务数操作,可用父子Phaser树的方式
public class Phaser {
    //构造方法
    //参与任务数为0
    public 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

猜你喜欢

转载自blog.csdn.net/monkeydcoding/article/details/81285122
今日推荐