Java线程同步-栅栏(CyclicBarrier)
栅栏是一种同步工具,用于等待一组线程达到某个共同点后再同时继续执行。它的内部维护一个计数器和一个屏障点,当线程到达屏障点时,会阻塞等待其他线程到达。每一个线程到达屏障点后,计算器就减1,当所有线程都到达屏障点后,计算器为0,栅栏打开,所有线程可以继续执行。
模拟五个人一起开饭
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5, () -> System.out.println("所有人等待完成,可以开始吃饭了"));
for (int i = 0; i < 5; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ":我到了 等待其他人吃饭");
try {
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName() + ":开始吃饭了");
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (BrokenBarrierException e) {
throw new RuntimeException(e);
}
}).start();
}
}
运行结果
Thread-0:我到了 等待其他人吃饭
Thread-4:我到了 等待其他人吃饭
Thread-3:我到了 等待其他人吃饭
Thread-2:我到了 等待其他人吃饭
Thread-1:我到了 等待其他人吃饭
所有人等待完成,可以开始吃饭了
Thread-1:开始吃饭了
Thread-0:开始吃饭了
Thread-2:开始吃饭了
Thread-3:开始吃饭了
Thread-4:开始吃饭了