简介
CyclicBarrier是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行.它非常适用于一组线程之间必需经常互相等待的情况。CyclicBarrier字面理解是循环的栅栏,之所以称之为循环的是因为在等待线程释放后,该栅栏还可以复用。
和CountDownLatch区别
- CountDownLatch:一个线程A等待其它线程都执行完毕后,这个线程A才继续执行。这个线程A也可以是一组线程(使用同一个CountDownLatch来控制即可).
- CyclicBarrier:一组线程互相等待,当它们都达到各自await()指定的barrier时,它们再同时继续执行各自下面的代码。
来个例子
public class CyclicBarrierLearning { @Test public void test() throws InterruptedException { final CyclicBarrier barrier = new CyclicBarrier(5, new Runnable() { public void run() { System.out.println("匹配完成,开始游戏。。。"); } }); for (int i = 0; i < 5; i++) { final String name = "用户:" + i; Thread thread = new Thread(new Runnable() { public void run() { try { Thread.currentThread().sleep(3000); System.out.println(name + "准备,等待其他玩家准备..."); barrier.await(); Thread.currentThread().sleep(2000); System.out.println(name + "加入游戏"); } catch (Exception e) { System.out.println(name + "离开游戏"); } } }); thread.start(); } while (true) { Thread.sleep(1000 * 10); break; } }}
运行结果
用户:2准备,等待其他玩家准备...用户:0准备,等待其他玩家准备...用户:1准备,等待其他玩家准备...用户:3准备,等待其他玩家准备...用户:4准备,等待其他玩家准备...匹配完成,开始游戏。。。用户:4加入游戏用户:2加入游戏用户:1加入游戏用户:0加入游戏用户:3加入游戏