并发包下phaser可以模拟CyclicBarrier循环屏障以及CountDownLatch计数器的作用

代码

import java.util.concurrent.Phaser;
//Phaser  相位器
//模拟CyclicBarrier循环屏障的作用
public class PhaCyclicBarrier {
    public static void main(String[] args) {
//        Phaser phaser = new Phaser(5);
//        getInfo(phaser);
        test2();

    }

    public  static  void test2(){
        Phaser phaser = new Phaser(5);  //初始五个阶段 (泛指同时五个线程处于运行状态)
        getInfo(phaser);
        for (int i = 0; i <10 ; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(new Double(Math.random()*3000).longValue());
                        System.out.println(Thread.currentThread().getName()+"玩家准备就绪");
                        //等同于(new CyclicBarrier(3)).await()方法  表示阻塞, 待每个阶段运行完毕,在释放所用线程
                        //5个线程执行arriveAndAwaitAdvance 即一个阶段结束
                        phaser.arriveAndAwaitAdvance();
                        System.out.println(Thread.currentThread().getName()+"选择英雄");

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start(); //start方法  开启线程
        }

    }

    private static void getInfo(Phaser phaser){
        System.out.println("阶段"+phaser.getPhase());
        System.out.println("到达数"+phaser.getArrivedParties());
        System.out.println("未到达"+phaser.getUnarrivedParties());
        System.out.println("总数"+phaser.getRegisteredParties());
    }
}

import java.util.concurrent.Phaser;
//Phaser  相位器
//模拟CountDownLatch倒计数器的作用
public class PhaCountDownLatch {
    public static void main(String[] args) {
//        Phaser phaser = new Phaser(5);
//        getInfo(phaser);
        test2();

    }

    public  static  void test2(){
        Phaser phaser = new Phaser(5);  //初始五个阶段 (泛指同时五个线程处于运行状态)
        getInfo(phaser);
        for (int i = 0; i <10 ; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(new Double(Math.random()*3000).longValue());
                        System.out.println(Thread.currentThread().getName()+"玩家准备就绪");
                        //等同于 (new CountDownLatch()).countDown()方法  达到并不阻塞
                        phaser.arrive();
//                        System.out.println(Thread.currentThread().getName()+"选择英雄");

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start(); //start方法  开启线程
        }

        //方法中的参数表示 处于第几阶段
        //等同于countDownLatch.await(); 先阻塞该线程  等到计数器为0(五个线程都arrive)时在进行执行
        phaser.awaitAdvance(0);
        System.out.println("游戏开始0");
        getInfo(phaser);
        phaser.awaitAdvance(1);
        System.out.println("游戏开始1");

    }

    private static void getInfo(Phaser phaser){
        System.out.println("阶段"+phaser.getPhase());
        System.out.println("到达数"+phaser.getArrivedParties());
        System.out.println("未到达"+phaser.getUnarrivedParties());
        System.out.println("总数"+phaser.getRegisteredParties());
    }
}

理解
在这里插入图片描述
phaser.arriveAndAdvance 大家都到了,并且都进行等待 类似于CyclicBarrier中的await方法
phaser.arrive 到达并不阻塞 类似于CountDownLatch计数器中的countdown方法
phaser.awaitAdvance(参数 第几阶段)类似于计数器中的await方法
可以模拟CyclicBarrier循环屏障以及CountDownLatch计数器的作用
初始是0阶段

CyclicBarrier 相较于CountDownLatch没有countdown方法,有await方法
在这里插入图片描述
获取到当前处于第几阶段 phaser.getPhase
在这里插入图片描述

线程注册并且注销

参考bilbilbi视频播放

这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!

欢饮加入技术群聊!!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值