背景:有10个同学进行吃瓜大赛,分为两组进行。要求每组内的同学都必须分到瓜以后,裁判喊开始才能进行比赛。
代码如下:
@Slf4j public class CyclicBarrierDemo { private static int peopleNum = 10; private static CyclicBarrier barrier = new CyclicBarrier(5, () -> { log.info("5人小组吃瓜比赛开始。。。"); }); public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 1; i <= peopleNum; i++) { int num = i; sleep(1000); executorService.execute(() -> { try { sleep(1000); log.info("同学{}分到西瓜,等待开始", num); barrier.await(); log.info("同学{}吃完西瓜,计时结束", num); } catch (Exception e) { log.error(e.getMessage()); } }); } } }
结果如下:
注意两个工具类的区别:
CountDownLatch: 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。
CyclicBrrier: N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。