CyclicBarrier线程回环栅栏(障碍)的使用

CyclicBarrier和CountDownLatch都有计数的作用。
CyclicBarrier可以重复使用(累加到count后会清零),CountDownLatch不能。
CyclicBarrier累加的,CountDownLatch是累减的。
CyclicBarrier.getParties() parties是team的意思,表示所需的数目

这里用斗地主需要3个人来说明用法,代码如下:

/**
 *  够3个人才可以斗地主
 *  每到一个人,就执行await(),相当于qq斗地主的准备状态
 *  3个人都到后,主线程开始执行  表示开了一桌斗地主
 */
public class CyclicBarrierDemo implements Runnable{
    private CyclicBarrier barrier;
    public CyclicBarrierDemo(CyclicBarrier barrier){
        this.barrier = barrier;
    }
    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName()+"从家里出发");
            Thread.sleep((1+(int)(Math.random()*(5-1)))*1000);
            System.out.println(Thread.currentThread().getName()+"到达棋牌室");
            barrier.await(); // 相当于qq斗地主里面的准备状态
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch ( BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
        // 斗地主3人即可开局
        int N = 3;
        CyclicBarrier barrier = new CyclicBarrier(N, new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+":人够了,开战");
            }
        });

        // 叫人叫人
        System.out.println(Thread.currentThread().getName()+"大家来斗地主啊");
        for (int i=0;i<3;i++){
            new Thread(new CyclicBarrierDemo(barrier),"线程"+i).start();
        }
        // 等会人够了再开一桌(CyclicBarrier是可以复用的,到达计数后,会自动清零,或者手动reset也可以)
        Thread.sleep(6000);
        for (int i=3;i<6;i++){
            new Thread(new CyclicBarrierDemo(barrier),"线程"+i).start();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值