并发工具类CyclicBarrier的源码分析以及使用场景

扫描下方二维码或者微信搜索公众号菜鸟飞呀飞,即可关注微信公众号,阅读更多Spring源码分析Java并发编程文章。

微信公众号

上一篇文章介绍了工具类CountDownLatch的原理和使用场景(并发工具类CountDownLatch的源码分析以及使用场景),今天将介绍JUC包下另一个十分常用的并发工具类CyclicBarrier,翻译过来就是可循环使用的屏障

简介

  • CyclicBarrier的功能与CountDownLatch的功能十分类似,也是控制线程的执行顺序,但是它与CountDownLatch的区别是,CyclicBarrier是让一组线程阻塞在同一屏障(同步点)处,直到最后一个线程到达屏障(也就是屏障的计数器减为0),屏障才会打开,这些阻塞在屏障处的线程才会继续往下执行。CountDownLatch是让一组或者一个线程等待其他线程执行完后,当前线程才继续执行。另外一点区别就是,CyclicBarrier的计数器减为0后,可以重置计数器,从而可以再次使用,这一点通过类名中含有Cyclic(循环)就能看出。而CountDownLatch的计数器减为0后,不会重置,因此不能重复使用。

示例

  • CyclicBarrier的使用也十分简单,只需要new一个CyclicBarrier创建一个实例对象,它的构造方法中需要传入一个int类型的参数,用来指定屏障的大小(即当多少个线程到达屏障后,屏障打开),然后在线程中调用await()方法即可让线程阻塞在屏障处。
  • 如下Demo示例中,通过10个线程模拟了十个短跑运动员。在现实生活中,100米赛跑的时候,运动员需要听到发令枪响之后才能起跑,所有运动员的起跑时间是在同一个时间的,不能抢跑。发令枪就相当于程序中的CyclicBarrier,当所有人准备好,听到发令枪响(达到屏障)时,才能开始起跑。
public class CyclicBarrierDemo {
   

    public static void main(String[] args) {
   
        Random random = new Random();
        CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
        List<Thread> threads = new ArrayList<>(10);
        for (int i = 0; i < 10; i++) {
   
            threads.add(new Thread(()->{
   
                int time = random.nextInt(5) + 1;
                try {
   
                    // 通过线程休眠来模拟每位运动员的准备时间
                    Thread.sleep(time * 1000);
                    System.out.println(Thread.currentThread().getName() + "准备就绪");
                    // 运动员准备就绪后,就示意发令员自己准备好了,即调用await()方法
                    cyclicBarrier.await();
                    System.out.println("起跑枪响,"+Thread.currentThread().getName() + "起跑");
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                } catch (BrokenBarrierException e) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CyclicBarrierCountDownLatch都是用于线程间的协调和同步的工具,但它们在使用场景上有一些区别。 CountDownLatch适用于一组线程等待另一组线程完成某个任务后再继续执行的场景。在CountDownLatch中,我们可以通过调用countDown()方法来减少计数器的值,而调用await()方法的线程会被阻塞,直到计数器的值变为0。这种机制可以用于实现一组线程等待其他线程完成初始化工作、数据加载等场景CyclicBarrier适用于一组线程互相等待,直到所有线程都到达某个屏障点后再继续执行的场景。在CyclicBarrier中,我们可以通过调用await()方法来等待其他线程到达屏障点,当所有线程都到达后,屏障点会被打破,所有线程可以继续执行。这种机制可以用于实现多个线程并发执行某个任务,然后在某个节点进行汇总或者等待其他线程的结果。 综上所述,CountDownLatch适用于一组线程等待另一组线程完成某个任务后再继续执行的场景,而CyclicBarrier适用于一组线程互相等待,直到所有线程都到达某个屏障点后再继续执行的场景。 #### 引用[.reference_title] - *1* *2* *3* [CountDownLatchCyclicBarrier使用](https://blog.csdn.net/qq_33371766/article/details/122017085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值