1. 概述
CyclicBarrier
是同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier。
2. 实现原理
-
CyclicBarrier内部维护了整型变量count(拦截线程计数器),每个线程调用
await()
时,count就会减1,如果count != 0
,则调用await()使线程进入等待状态;如果count == 0
,所有调用await()的线程会被唤醒。 -
CycliBarrier底层基于ReentrantLock和Condition实现,如果
count != 0
时,则调用Condition的await()方法使线程进入等待状态;如果count == 0
,则调用Condition的singleAll()
唤醒所有等待的线程。
3. 使用示例
举个例子,操场5条跑道,起跑线相当于屏障,5个运动员先后就绪后,鸣枪,开跑!
public class CyclicBarrierDemo implements Runnable {
private static final CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("鸣枪!!!!!!!!!!!!!!!!");
}
});
private static final CyclicBarrierDemo demo = new CyclicBarrierDemo();
@Override
public void run() {
try {
System.out.println("运动员:" + Thread.currentThread().getName() + "准备就绪");
cyclicBarrier.await();
System.out.println("运动员:" + Thread.currentThread().getName() + "开跑");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 1; i <= 5; i++) {
executorService.execute(demo);
}
}
}
网友评论