phaser 使用

摘抄:
https://www.jianshu.com/p/1517a379fb91
可参考:
https://www.iteye.com/blog/shift-alt-ctrl-2302923

常用方法
1,设定任务数(这是官方解释,简单的讲比如我们指定任务数为3,那3个线程都运行到指定地方他们才会分别继续往下执行)

\\批量设置任务数
public int bulkRegister(int parties)
\\动态增加1个任务数
public int register()
\\减少一个任务数
public int arriveAndDeregister()

2,到达等待

\\线程执行到此开始等待,满足条件(任务数满足)则继续执行
public int arriveAndAwaitAdvance() 
\\ 线程执行到此不用等待继续执行,但会让任务数加1,然后会重置任务数。
public int arrive()
\\传入的phase表示翻越几个屏障,如果传入的等于getPhase则等待
public int awaitAdvance(int phase)
\\可中断的awaitAdvance
public int awaitAdvanceInterruptibly(int phase);
\\可规定时间指定栏数未变,则抛出异常
public int awaitAdvanceInterruptibly(int phase,
                                         long timeout, TimeUnit unit)

3,得到栏数以及任务数

\\当前执行到第几个屏障
public final int getPhase()
\\得到注册的任务数
public int getRegisteredParties()
\\已经执行的任务数
public int getArrivedParties()
\\还未执行的任务数
public int getUnarrivedParties()

4,通过屏障时调用

\\该方法返回true则直接通过屏障 false则屏障继续工作,要想实现自己的逻辑代码需要复写此方法
protected boolean onAdvance(int phase, int registeredParties)

5,关闭屏障

\\取消屏障
public void forceTermination()
\\phaser是否销毁
public boolean isTerminated()
public class PharseDemo {

    public static void main(String[] args) throws InterruptedException {
        //10名运动员,每名运动员在同一时间点的开始
        Phaser pharse = new Phaser(10) {
            @Override
            protected boolean onAdvance(int phase, int registeredParties) {
                if(phase == 0) {
                    System.out.println("所有人员已经到赛场");
                }else if(phase == 1) {
                    System.out.println("所有人员准备完毕,开始比赛");
                }else if(phase == 2) {
                    System.out.println("比赛结束");
                }
                return super.onAdvance(phase, registeredParties);
            }
        };
        //创建10个线程
        Runner run = new Runner(pharse);
        Thread[] thread  = new Thread[10];
        for (int i = 0; i < 10; i++) {
            thread[i] = new Thread(run);
        }
        Thread.sleep(3000);
        for (int i = 0; i < 10; i++) {
            thread[i].start();
        }
    }
    
}

class Runner implements Runnable{

    private Phaser phaser;
    Random random = new Random();
    
    public Runner(Phaser phaser) {
        super();
        this.phaser = phaser;
    }



    @Override
    public void run() {
        try {
            //第一阶段  到达赛场 每个运动员情况不一样
            Thread.sleep(random.nextInt(3000));
            System.out.println(Thread.currentThread().getName()+"已经到达赛场");
            phaser.arriveAndAwaitAdvance();
            //第二阶段   开始准备 
            Thread.sleep(random.nextInt(3000));
            System.out.println(Thread.currentThread().getName()+"已经准备好");
            phaser.arriveAndAwaitAdvance();
            //第二阶段   到达终点
            Thread.sleep(random.nextInt(3000));
            System.out.println(Thread.currentThread().getName()+"已经到达终点");
            phaser.arriveAndAwaitAdvance();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值