CyclicBarrier学习笔记

和CountDownLatch有点类似,CyclicBarrier也是类似一个栅栏操作----等待子线程全部执行完再执行下个动作;但是CyclicBarrier能重复使用,CountDownLatch只能用一次,

public class CyclicBarrierDemo {
    public static class Soldier implements Runnable{
        private String soldier;
        private final CyclicBarrier cyclic;
        Soldier(CyclicBarrier cyclic,String soldierName){
            this.cyclic=cyclic;
            this.soldier=soldierName;
        }
        @Override
        public void run() {
            try {
                System.out.println(soldier+"报道");//执行士兵报道任务
                cyclic.await();//等所有士兵报道完成执行CyclicBarrier中定义的BarrierRun动作
                doWork();//CyclicBarrier清零,执行士兵工作任务
                cyclic.await();//等所有士兵工作完成执行CyclicBarrier中定义的BarrierRun动作
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
        void doWork(){
            try {
                Thread.sleep(Math.abs(new Random().nextInt()%10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(soldier+":任务完成");
        }
    }

    public static class BarrierRun implements Runnable{
        public BarrierRun(boolean flag, int n) {
            this.flag = flag;
            this.N = n;
        }
        boolean flag;
        int N;

        @Override
        public void run() {
            if(flag){
                System.out.println("司令:[士兵" +N+"个,任务完成!]");
            }else{
                System.out.println("司令:[士兵" +N+"个,集合完毕!]");
                flag=true;
            }
        }
    }
    public static void main(String[] args) {
        final int N=3;
        Thread[] allSoldier=new Thread[N];
        boolean flag=false;
        CyclicBarrier cyclic=new CyclicBarrier(N,new BarrierRun(flag,N));
        System.out.println("集合队伍");
        for(int i=0;i<N;i++){
            allSoldier[i]=new Thread(new Soldier(cyclic,"士兵"+i));
            allSoldier[i].start();
        }
    }
}
执行结果如下:
集合队伍
士兵1报道
士兵2报道
士兵0报道
司令:[士兵3个,集合完毕!]
士兵1:任务完成
士兵2:任务完成
士兵0:任务完成
司令:[士兵3个,任务完成!]

解析:定义了一个CyclicBarrier cyclic=new CyclicBarrier(N,new BarrierRun(flag,N));N代表子任务有N个,当子任务都完成时执行BarrierRun任务;

cyclic.await();表示等所有子任务完成就会去执行CyclicBarrier中定义的BarrierRun任务;

转载于:https://my.oschina.net/u/3734816/blog/3060372

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值