zoukankan      html  css  js  c++  java
  • CyclicBarrier

    1、CyclicBarrier的定义

    一个同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。就是所有子程序都执行完成之后,开始执行主程序。

    import java.util.Random;
    import java.util.concurrent.*;
    
    /**
     * Created by Administrator on 2017/5/22 0022.
     */
    public class Test {
    
        public static void main(String[] args) {
            //如果将参数改为4,但是下面只加入了3个选手,这永远等待下去
            CyclicBarrier barrier = new CyclicBarrier(3);
            ExecutorService executor = Executors.newFixedThreadPool(3);
            executor.submit(new Thread(new Runner(barrier,"1号选手")));
            executor.submit(new Thread(new Runner(barrier,"2号选手")));
            executor.submit(new Thread(new Runner(barrier,"3号选手")));
            executor.shutdown();
    
        }
    }
    
    class Runner implements Runnable{
        // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
        private CyclicBarrier barrier;
    
        private String name;
    
        public Runner(CyclicBarrier barrier, String name) {
            super();
            this.barrier = barrier;
            this.name = name;
        }
    
        @Override
        public void run() {
            try {
                Thread.sleep(1000*(new Random()).nextInt(8));
                System.out.println(name+"准备好了!");
                barrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
    
            System.out.println(name + " 起跑!");
        }
    
    }

    执行结果为

    2、CyclicBarrier和CountDownLatch的区别

    首先看看javadoc中的解释

      CountDownLatch:允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
          CyclicBarrier:一个允许一组线程全部相互等待达到共同屏障点的同步辅助功能。

    那么可以看出

      CountDownLatch中是一个或多个线程在等待,其他线程执行完了,可以等待,也可以终止。该类就像计数器, 线程完成一个就记一个, 就像 报数一样, 只不过是递减的.

      CyclicBarrier中是一个或多个线程在等待,其他线程中任何一个未完成,其他都必须等待。该类就像一个水闸, 线程执行就想水流, 在水闸处都会堵住, 等到水满(线程到齐)了, 才开始泄流.

  • 相关阅读:
    "无法在证书存储区中找到清单签名证书"的解决办法
    ASP.net从服务器端向客户端弹出alert对话框,但不使页面变成白板
    C#日期相关操作
    在Lucene.net实现自定义排序
    做技术二十多年 突然明白的道理
    .net中sql防止注入式攻击
    开发可统计单词个数的Android驱动程序(1)
    乐博Android客户端(新浪微博)1.01发布,欢迎各位童鞋试用
    百度面试题:求绝对值最小的数
    赶紧升级到Android 2.3.4,体验最新的Android技术
  • 原文地址:https://www.cnblogs.com/gudulijia/p/6889589.html
Copyright © 2011-2022 走看看