0
点赞
收藏
分享

微信扫一扫

CyclicBarrier

鲤鱼打个滚 2021-10-15 阅读 71
技术分享

CyclicBarrier可循环使用的屏障,让一组线程到达一个屏障或同步点时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await方法。


代码示例

public static void main(String[] args) {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
        System.out.println("完成召唤");
    });
    for (int i = 0; i < 7; i++) {
        final int finalI = i;
        new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " 收到第" + finalI + "龙珠");
            try {
                cyclicBarrier.await();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, String.valueOf(i)).start();
    }
}

执行结果

1 收到第1龙珠
4 收到第4龙珠
0 收到第0龙珠
5 收到第5龙珠
2 收到第2龙珠
3 收到第3龙珠
6 收到第6龙珠
完成召唤
CyclicBarrier和CountDownLatch的区别
CountDownLatch CyclicBarrier
减计数方式 加计数方式
计算为0时释放所有等待的线程 计数达到指定值时释放所有等待线程
计数为0时,无法重置 计数达到指定值时,计数置为0重新开始
调用countDown()方法计数减1,调用await()方法只进行阻塞,对计数没任何影响 调用await()方法计数加1,若加1后的值不等于构造方法的值,则线程阻塞
不可重复利用 可重复利用
举报

相关推荐

0 条评论