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

  • 相关阅读:
    关于Sprte2d的图片切割
    关于U3d GameObject类型的可用描述
    [小巩u3d] Sprite 2D的资源占用分析
    [小巩u3d] 关于Raycast对BoxCollider和BoxCollider2d的碰撞监测规则
    Web服务器父与子 Apache和Tomcat区别
    [转]IIS添加MIME扩展类型及常用的MIME类型列表
    转载自知乎:程序员干到三十就干不动了」的说法是从哪来的?
    Unity之如何去除动画scale
    Unity shader学习之简单的水效果
    Unity shader学习之卡通渲染,轮廓线
  • 原文地址:https://www.cnblogs.com/gudulijia/p/6889589.html
Copyright © 2011-2022 走看看