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

原文地址:https://www.cnblogs.com/gudulijia/p/6889589.html