CyclicBarrier是一个同步工具类,它容许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行.它很是适用于一组线程之间必需常常互相等待的状况。CyclicBarrier字面理解是循环的栅栏,之因此称之为循环的是由于在等待线程释放后,该栅栏还能够复用。工具
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加入游戏