同步工具CyclicBarrier

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33248299/article/details/78838480

一.CyclicBarrier概述

  • 从英文上面理解就是循环的障碍物

表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,在指定地点集合后再同时开始就餐

这里写图片描述

  • 三个线程干完各自的任务,在不同的时刻到达集合点后,就尅接着忙各自的工作去了,再到达新的集合点,再去忙各自的工作,到达集合点了用CycicBarrier对象的await方法表示
  • 为什么几个人能碰到一起,说白了,就是大家都把手头这一阶段的工作做完了,就可以碰到一起了,譬如,我下楼等方老师,就是等他手头工作做完了,他到达了要集合的状态,就集合了
public class CyclicBarrierTest {

      public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final CyclicBarrier cb = new CyclicBarrier(3);//3个人就满了

        for(int i =0;i<3;i++) {
            Runnable runnable = new Runnable() {

                @Override
                public void run() {
                    try {
                        Thread.sleep((long)(Math.random()*10000));
                       System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点1, 当前已有"+
                        (cb.getNumberWaiting()+1)+"个已经到达,"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
                         cb.await();

                         Thread.sleep((long)(Math.random()*10000));
                           System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点2, 当前已有"+
                            (cb.getNumberWaiting()+1)+"个已经到达,"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
                             cb.await();

                             Thread.sleep((long)(Math.random()*10000));
                               System.out.println("线程" + Thread.currentThread().getName() + "即将到达集合地点3, 当前已有"+
                                (cb.getNumberWaiting()+1)+"个已经到达,"+(cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
                                 cb.await();


                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            };
            service.execute(runnable);
        }

        service.shutdown();
    }
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_33248299/article/details/78838480