java并发-CyclicBarrier(循环栅栏)

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

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

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

    public static void main(String[] args) throws Exception{
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        //所有线程都设置完key value为统一输出map对象
        Map 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(循环栅栏))