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可以重复使用
相关文章
|
4月前
|
监控 测试技术 程序员
解决线程死循环问题的有效方法
作为开发者想必都清楚,多线程应用程序的开发为我们日常开发工作中提供了并发执行任务的能力,但线程死循环问题却是一个常见而令人头疼的挑战,因为线程死循环可能导致系统的不稳定性、资源浪费以及应用程序的异常运行,所以准确地定位和妥善处理线程死循环现象,并在编码阶段就避免潜在风险,成为开发人员必须面对的重要问题,线程死循环问题的解决不仅有助于提高系统的稳定性和可用性,还能优化资源利用和提升应用程序的性能,通过采取适当的预防和处理措施,开发人员能够避免线程陷入无尽的循环,并及时发现和解决潜在问题。那么本文就来分享一下关于如何处理线程死循环问题,以及如何在编码阶段规避潜在风险。
136 2
解决线程死循环问题的有效方法
|
4月前
|
Java 测试技术
CountDownLatch、CyclicBarrier让线程听我号令
CountDownLatch、CyclicBarrier让线程听我号令
56 0
|
3月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
25 1
|
10月前
CyclicBarrier(栅栏)实现高并发测试
CyclicBarrier(栅栏)实现高并发测试
|
4月前
|
并行计算 安全 Java
CyclicBarrier(循环屏障)源码解读与使用
CyclicBarrier(循环屏障)源码解读与使用
|
4月前
|
Java 索引
多线程并发之CyclicBarrier(栅栏)使用详解
多线程并发之CyclicBarrier(栅栏)使用详解
134 2
|
4月前
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
58 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
|
4月前
多线程并发之CountDownLatch(闭锁)使用详解
多线程并发之CountDownLatch(闭锁)使用详解
131 0
|
Java 开发工具 git
【Java多线程】如何正确使用循环栅栏CyclicBarrier
想象一个这样的场景,我们在打王者荣耀/英雄联盟的时候,都会有一个匹配机制,需要10个人都加载完成后,大家才能一起进入游戏,不然会出现大家进入游戏的时间不一致的情况,这个时候就可以使用CyclicBarrier来实现。
深入理解JUC:第五章:CyclicBarrier循环栅栏
深入理解JUC:第五章:CyclicBarrier循环栅栏
104 0
深入理解JUC:第五章:CyclicBarrier循环栅栏