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加入遊戲