CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
CyclicBarrier 支持一个可选的 Runnable
命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
public class CyclicBarrierTest {
private final int RUNNER_COUNT = 10;
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("人到齐了,开跑....");
}
};
final CyclicBarrier barrier = new CyclicBarrier(RUNNER_COUNT, runnable);
public void goHome() throws InterruptedException, BrokenBarrierException {
System.out.println(Thread.currentThread().getName() + "预备....");
barrier.await();
System.out.println(Thread.currentThread().getName() + "跑到终点....");
}
public static void main(String[] args) throws InterruptedException,
BrokenBarrierException {
final CyclicBarrierTest instance = new CyclicBarrierTest();
/**
* 每个线程代表一个Runner
*/
for (int i = 0; i < instance.RUNNER_COUNT; i++) {
new Thread("Runner" + i + " ") {
public void run() {
try {
instance.goHome();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
};
}.start();
}
}
}
结果:
Runner0 预备....
Runner3 预备....
Runner2 预备....
Runner1 预备....
Runner5 预备....
Runner4 预备....
Runner6 预备....
Runner8 预备....
Runner7 预备....
Runner9 预备....
人到齐了,开跑....
Runner9 跑到终点....
Runner0 跑到终点....
Runner1 跑到终点....
Runner7 跑到终点....
Runner8 跑到终点....
Runner6 跑到终点....
Runner4 跑到终点....
Runner5 跑到终点....
Runner2 跑到终点....
Runner3 跑到终点....