CyclicBarrier

一、CyclicBarrier的定义

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

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 + " 起跑!");
    }

}

执行结果为dom

二、CyclicBarrier和CountDownLatch的区别

首先看看javadoc中的解释ide

  CountDownLatch:容许一个或多个线程等待直到在其余线程中执行的一组操做完成的同步辅助。
      CyclicBarrier:一个容许一组线程所有相互等待达到共同屏障点的同步辅助功能。
this

那么能够看出spa

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

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

相关文章
相关标签/搜索