参考文档:
Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例:https://www.cnblogs.com/skywang12345/p/3533995.html
简介
CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环的 barrier。基于ReentrantLock实现
举个栗子
/** * 简单模拟一下对战平台中玩家需要完全准备好了,才能进入游戏的场景。 * * @author BFD_526 * */ public class CyclicBarrierTest { public static void main(String[] args) { test(); } // 同步屏障 static void test() { ExecutorService service = Executors.newFixedThreadPool(5); CyclicBarrier barrier = new CyclicBarrier(5); for (int i = 0; i < 5; i++) { service.execute(new Player("玩家" + i, barrier)); } service.shutdown(); } // 同步屏障重置 static void test1() { ExecutorService service = Executors.newFixedThreadPool(5); CyclicBarrier barrier = new CyclicBarrier(5); for (int i = 0; i < 5; i++) { service.execute(new Player("玩家" + i, barrier)); } for (int i = 5; i < 10; i++) { service.execute(new Player("玩家" + i, barrier)); } service.shutdown(); } // 在同步屏障结束后,启动优先线程 static void test2() { ExecutorService service = Executors.newFixedThreadPool(5); CyclicBarrier ba = new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("所有玩家已就位"); } }); for (int i = 0; i < 5; i++) { service.execute(new Player("玩家" + i, ba)); } } } class Player implements Runnable { private final String name; private final CyclicBarrier barrier; public Player(String name, CyclicBarrier barrier) { this.name = name; this.barrier = barrier; } public void run() { try { TimeUnit.SECONDS.sleep(1 + (new Random().nextInt(3))); System.out.println(name + "已准备,等待其他玩家准备..."); barrier.await(); TimeUnit.SECONDS.sleep(1 + (new Random().nextInt(3))); System.out.println(name + "已加入游戏"); } catch (InterruptedException e) { System.out.println(name + "离开游戏"); } catch (BrokenBarrierException e) { System.out.println(name + "离开游戏"); } } }