併發編程之CyclicBarrier

簡介

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加入遊戲
相關文章
相關標籤/搜索