博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发编程之CyclicBarrier
阅读量:7165 次
发布时间:2019-06-29

本文共 1603 字,大约阅读时间需要 5 分钟。

hot3.png

简介

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加入游戏

转载于:https://my.oschina.net/xiongying0214/blog/1976006

你可能感兴趣的文章