CyclicBarrier循环栅栏

简介: CyclicBarrier循环栅栏和CountDownLatch 很类似 ,都能阻塞一组线程- 当有大量线程相互配合,分别计算不同任务,并且需要最后统一汇总的时候,我们可以使用CyclicBarrier 。CyclicBarrier可以构造一个集结点,当某一个线程执行完毕,他就会到集结点等待,知道所有线程都到了集结点,那么该栅栏就被撤销,所以有线程在统一出发,继续执行剩下都任务。

@[toc]
在这里插入图片描述


- CyclicBarrier循环栅栏和CountDownLatch 很类似 ,都能阻塞一组线程 - 当有大量线程相互配合,分别计算不同任务,并且需要最后统一汇总的时候,我们可以使用CyclicBarrier 。CyclicBarrier可以构造一个集结点,当某一个线程执行完毕,他就会到集结点等待,知道所有线程都到了集结点,那么该栅栏就被撤销,所以有线程在统一出发,继续执行剩下都任务。 - 生活中的例子:“ 咋们3个人明天中午在学校碰面,都到齐后,一起讨论下学期的计划” 代码演示 ```java package com.yxl.task; import lombok.SneakyThrows; import java.util.concurrent.CyclicBarrier; /** * 演示CyclicBarrier demo */ public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() { @Override public void run() { System.out.println("所有人到了,大家一起出发"); } }); for (int i = 0; i < 5; i++) { new Thread(new Task(i,cyclicBarrier)).start(); } } static class Task implements Runnable{ private int id; private CyclicBarrier cyclicBarrier; public Task(int id, CyclicBarrier cyclicBarrier) { this.id = id; this.cyclicBarrier = cyclicBarrier; } @SneakyThrows @Override public void run() { System.out.println("线程"+id + "前往集合地点"); Thread.sleep((long) (Math.random()*10000)); System.out.println("线程"+id+"到了集合地点,等待其他人到达"); cyclicBarrier.await(); System.out.println("线程"+id+"出发了"); } } } ``` 执行结果 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200719123430592.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTc3ODM4,size_16,color_FFFFFF,t_70) 并且 CyclicBarrier 有个特点 可重用 ```java for (int i = 0; i < 10; i++) { new Thread(new Task(i,cyclicBarrier)).start(); } ``` 我们把这个改成10个线程,查看结果 ![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/20200719123616583.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTc3ODM4,size_16,color_FFFFFF,t_70) 一起出发,5个先到 5个先走 ,可重用的特性 CyclicBarrier 和 CountDownLatch 的区别 - 作用不同 CyclicBarrier要等固定数量等线程都达到了栅栏位置才能继续执行,而CountDownLatch 只需等待数字到0,也就是说,CountDownLatch 用于事件,但是CyclicBarrier 是用于线程的 - 可用性不同:CountDownLatch在倒数到0并处罚门阀打开后,就不能再次使用了,除非新建新到实例;而CyclicBarrier可以重复使用
相关文章
|
6月前
|
Java 测试技术
CountDownLatch、CyclicBarrier让线程听我号令
CountDownLatch、CyclicBarrier让线程听我号令
77 0
|
2月前
|
Java
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
本文介绍了拼多多面试中的模拟拼团问题,通过使用 `CyclicBarrier` 实现了多人拼团成功后提交订单并支付的功能。与之前的 `CountDownLatch` 方法不同,`CyclicBarrier` 能够确保所有线程到达屏障点后继续执行,并且屏障可重复使用。文章详细解析了 `CyclicBarrier` 的核心原理及使用方法,并通过代码示例展示了其工作流程。最后,文章还提供了 `CyclicBarrier` 的源码分析,帮助读者深入理解其实现机制。
|
5月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
34 1
CyclicBarrier(栅栏)实现高并发测试
CyclicBarrier(栅栏)实现高并发测试
|
6月前
|
并行计算 安全 Java
CyclicBarrier(循环屏障)源码解读与使用
CyclicBarrier(循环屏障)源码解读与使用
|
6月前
|
Java 索引
多线程并发之CyclicBarrier(栅栏)使用详解
多线程并发之CyclicBarrier(栅栏)使用详解
160 2
|
6月前
多线程并发之CountDownLatch(闭锁)使用详解
多线程并发之CountDownLatch(闭锁)使用详解
230 0
|
Java 开发工具 git
【Java多线程】如何正确使用循环栅栏CyclicBarrier
想象一个这样的场景,我们在打王者荣耀/英雄联盟的时候,都会有一个匹配机制,需要10个人都加载完成后,大家才能一起进入游戏,不然会出现大家进入游戏的时间不一致的情况,这个时候就可以使用CyclicBarrier来实现。
112 0
深入理解JUC:第五章:CyclicBarrier循环栅栏
深入理解JUC:第五章:CyclicBarrier循环栅栏
114 0
深入理解JUC:第五章:CyclicBarrier循环栅栏
多线程并发之CountDownLatch阻塞等待
多线程并发之CountDownLatch阻塞等待
多线程并发之CountDownLatch阻塞等待