CyclicBarrier,是一个同步辅助类,可以实现让一组线程互相等待,直到某一状态后(common barrier point公共屏障点)再全部同时执行(并发动作)。
而且barrier在释放等待线程后可以重复使用,所以称为循环的barrier。
CyclicBarrier支持可选的runnable命令,在一组线程的最后一个线程到达barrier后,会执行这个runnable命令一次。
public class CyclicBarrierDemo {
public static void main(String[] args) {
int N = 4;
// 在CyclicBarrier()增加runnable参数后,从结果可以看出,当四个线程的最后一个线程都到达barrier状态后,会运行这个Runnable命令
CyclicBarrier barrier = new CyclicBarrier(N, new Runnable() {
@Override
public void run() {
System.out.println("当前线程" + Thread.currentThread().getName());
}
});
for (int i = 0; i < N; i++) {
new Writer(barrier).start();
}
}
static class Writer extends Thread {
private CyclicBarrier cyclicBarrier;
public Writer(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
public void run() {
System.out.println("线程" + Thread.currentThread().getName()
+ "正在写入数据...");
try {
Thread.sleep(5000);// 以睡眠来模拟写入数据操作
System.out.println("线程" + Thread.currentThread().getName()
+ "写入数据完毕,等待其他线程写入完毕");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
// 待所有线程都执行完后,才继续执行此句
System.out.println("所有线程写入完毕,继续处理其他任务...");
}
}
}