一。java
1>CyclicBarrier相似于CountDownLatch也是个计数器,不一样的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程达到了CyclicBarrier初始时规定的数目时,全部进入等待状态的线程被唤醒并继续。而CountDownLatch的做用是 只有线程中CountDownLatch被数到0时,才执行CountDownLatch对象await操做后面的逻辑功能。 想探究CountDownLatch能够参考上篇博文
dom
2>CyclicBarrier就像他的名字同样,能够当作是个障碍,全部的线程必须到期后才能一块儿经过这个障碍ide
3>CyclicBarrier初始时还能够带一个Runnable参数,此Runnable任务在CyclicBarrier的数目达到后、全部其余线程被唤醒前执行。测试
4>测试代码以下
this
public class CyclicBarrierTest { public static class ComponentThread implements Runnable { CyclicBarrier barrier; int id; int[] array; public ComponentThread(CyclicBarrier barrier, int[] array, int id) { this.barrier = barrier; this.array = array; this.id = id; } @Override public void run() { array[id] = new Random().nextInt(100); System.out.println("Component " + id + "generates" + array[id]); try { barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("Component " + id + " awaked"); int result = array[id] + array[id + 1]; System.out.println("Component " + id + " result:" + result); } } public static void testCyclicBarrier() { final int[] array = new int[3]; CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() { @Override public void run() { System.out.println("test CyclicBarrier run..."); array[2] = array[0] + array[1]; } }); new Thread(new ComponentThread(barrier, array, 0)).start(); new Thread(new ComponentThread(barrier, array, 1)).start(); } public static void main(String[] args) { CyclicBarrierTest.testCyclicBarrier(); } }