循环栅栏,用来进行线程协作,等待线程满足某个计数,构造时设置【计数个数】,每个线程执行到某个需要“同步”的时刻调用await()方法等待,当等待的线程数满足【计数个数】时,继续执行
CyclicBarrier barrier = new CyclicBarrier(2);
new Thread(() -> {
System.out.println("线程1开始" + new Date());
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("线程1继续向下运行" + new Date());
}).start();
new Thread(() -> {
System.out.println("线程2开始" + new Date());
try {
Thread.sleep(2000);
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("线程2继续向下运行" + new Date());
}).start();
输出
线程1开始Mon May 16 00:53:05 CST 2022
线程2开始Mon May 16 00:53:05 CST 2022
线程2继续向下运行Mon May 16 00:53:07 CST 2022
线程1继续向下运行Mon May 16 00:53:07 CST 2022
注意 CyclicBarrier和CountDownLatch的主要区别在于CyclicBarrier是可以重用的,CyclicBarrier可以比喻作【人满发车】