并发编程之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加入游戏
相关文章
相关标签/搜索