CyclicBarrier基本使用

/**
 * CyclicBarrier可重复使用的屏障
 * 我们定义这个屏障,使得子线程在执行的时候可以在某个时刻在这个屏障上等待其他线程
 * 等到等待的线程数到达阈值时才一起继续执行
 * 而可重复的概念就是走完了上面的一次等待之后重新一次执行的流程之后
 * 线程又可以重新在这个屏障上等待,等待其他线程再次都到达屏障之后再继续
 * 使用上,首先也需要是有个共享的CyclicBarrier变量可以供线程共享调用来执行await等待
 * 增强的构造函数上还可以定义一个线程来 汇总其他等待线程等待时已经执行完的结果
 */
public class CyclicBarrierTest {

    static CyclicBarrier cyclicBarrier = new CyclicBarrier(4,new CollectionThread());

    static ConcurrentHashMap<String,Long> resMap=new ConcurrentHashMap<>();



    public static class CollectionThread implements  Runnable{

        @Override
        public void run() {
            System.out.println("i colleciton the all subThread result");
            for(Map.Entry<String,Long> item:resMap.entrySet()){
                System.out.println(item.getKey()+":"+item.getValue());
            }
        }
    }

    public static class SubThread implements  Runnable{

        @Override
        public void run() {
            System.out.println("i am subThread:"+Thread.currentThread().getName()+" i fill the map");
            resMap.put(Thread.currentThread().getName(),1L);
            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            System.out.println("i am subThread:"+Thread.currentThread().getName()+" i fill the map  second");
            resMap.put(Thread.currentThread().getName(),2L);

            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }
    }

    public static void main(String[] args) {
        System.out.println("main start run");
        for(int i=0;i<4;i++){
            new Thread(new SubThread()).start();
        }
        System.out.println("main continue");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值