CyclicBarrier 用来阻塞一组线程,等待线程完成后才开始某件事情。
例如,开启5个线程,每个线程使用await方法开始阻塞,等待5个线程都完成,才开始执行await方法后面的代码。
public class CyclicBarrierTest {
private static CyclicBarrier barrier = new CyclicBarrier(5);
static class Writer extends Thread {
private CyclicBarrier cyclicBarrier;
public Writer(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
@Override
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("所有线程写入完毕,继续处理其他任务...");
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"开始执行");
int count = 5;
CyclicBarrier barrier = new CyclicBarrier(count);
for(int i=0;i<count;i++) {
new Writer(barrier).start();
}
System.out.println(Thread.currentThread().getName()+"继续执行");
}
}