一。
1>CyclicBarrier类似于CountDownLatch也是个计数器,不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,当线程达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。而CountDownLatch的作用是 只有线程中CountDownLatch被数到0时,才执行CountDownLatch对象await操作后面的逻辑功能。 想探究CountDownLatch可以参考上篇博文
2>CyclicBarrier就像他的名字一样,可以看成是个障碍,所有的线程必须到期后才能一起通过这个障碍
3>CyclicBarrier初始时还可以带一个Runnable参数,此Runnable任务在CyclicBarrier的数目达到后、所有其他线程被唤醒前执行。
4>测试代码如下
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();
}
}