美文网首页
java并发-CyclicBarrier(循环栅栏)

java并发-CyclicBarrier(循环栅栏)

作者: MJLDG | 来源:发表于2019-12-28 19:17 被阅读0次

    CyclicBarrier,juc下的同步工具类,简称循环栅栏。

    让一组线程同时达到一个屏障(同步点)时被阻塞,直到最后一条线程达到屏障时,
    所有在屏障前阻塞等待的线程都会被唤醒,然后继续执行。

    应用场景:
    例如朋友约一起打个篮球,你必须得等待双方人都到期了才能开始,不能来一场3v5的决赛吧。
    这时候在最后一个人到来之前,前面先来的人必须得先等待(到达一个屏障时被阻塞),当最后一人
    来到时(到达屏障),所有之前来的人都知道了比赛可以开始了(即阻塞的线程被唤醒),然后就开始
    比赛吧。

        public static void main(String[] args) throws Exception{
            ExecutorService executorService = Executors.newFixedThreadPool(10);
            //所有线程都设置完key value为统一输出map对象
            Map<Integer, Integer> map = new ConcurrentHashMap<>();
            int size = 5;
            CyclicBarrier cyclicBarrier = new CyclicBarrier(size, () ->{
                System.err.println("--所有线程都设置完key value 了 ---- " + map);
            });
            for (int i = 1; i <= size; i++) {
                final int temp = i;
                executorService.execute(()->{
                    try {
                        //模拟等待时间
                        Thread.sleep(new Random().nextInt(2000));
                        map.put(temp, temp);
                        System.err.println(Thread.currentThread().getName()+"setKey-Value---"+ temp+":"+temp);
                        cyclicBarrier.await();
                        System.err.println(Thread.currentThread().getName()+"都设置完key value 了,继续跑--"+ temp);
                    }catch (Exception e){
                        e.printStackTrace();
                    }finally {
                    }
                });
            }
            executorService.shutdown();
        }
    

    输出如下

    pool-1-thread-2setKey-Value---2:2
    pool-1-thread-3setKey-Value---3:3
    pool-1-thread-5setKey-Value---5:5
    pool-1-thread-4setKey-Value---4:4
    pool-1-thread-1setKey-Value---1:1
    --所有线程都设置完key value 了 ---- {1=1, 2=2, 3=3, 4=4, 5=5}
    pool-1-thread-2都设置完key value 了,继续跑--2
    pool-1-thread-3都设置完key value 了,继续跑--3
    pool-1-thread-5都设置完key value 了,继续跑--5
    pool-1-thread-4都设置完key value 了,继续跑--4
    pool-1-thread-1都设置完key value 了,继续跑--1
    

    相关文章

      网友评论

          本文标题:java并发-CyclicBarrier(循环栅栏)

          本文链接:https://www.haomeiwen.com/subject/vtidoctx.html