总结篇(32)---JUC工具类(2)CyclicBarrier

本文介绍了Java并发工具类CyclicBarrier的原理与使用,包括其与CountDownLatch的区别,以及在多线程同步中的应用。通过实例展示了CyclicBarrier如何在所有线程到达屏障点后执行指定任务,并且可以重置计数,便于重复使用。此外,还提供了完整的Java代码示例来解释CyclicBarrier的工作流程。

CyclicBarrier

  • 它允许一组线程相互等待,直到达到某个公共屏障点,也就是阻塞在调用cyclicBarrier.await()的地方。
  •  使用场景:类似CountDownLatch,但CyclicBarrier提供了几个countDownLatch没有的方法以应付更复杂的场景。

 

备注:

  • 看上去功能跟CountDownLatch差不多,但CountDownLatch的计数无法被重置,如果需要重置,还是需要考虑使用CyclicBarrier。
  • 另外,CyclicBarrier初始化时还可添加一个Runnable的参数,此Runnable在CyclicBarrier的数目达到后,所有其他线程被唤醒前被最后一个进入CyclicBarrier的线程执行。


      
        

一、CyclicBarrier的使用:


public void latch() throws InterruptedException{
    int count = 5;
    CyclicBarrier cb = new CyclicBarrier(count,new Runnable(){
        @Override
        public void run(){
            System.out.println("全部执行完毕");
        }
    });
    ExecutorService executorService = Executors.newFixedThreadPool(count);
    while(true){
        for(int x = 0;x < count;x++){
            executorService.execute(new Worker(x,cb));
        }
    }
}

Class Worker extends Thread{
    Integer start;
    CyclicBarrier cyclicBarrier;
    
    public Worker(Integer start,CyclicBarrier cyclicBarrier){
        this.start = start;
        this.cyclicBarrier = cyclicBarrier;
    }
    
    @Override
    public void run(){
        System.out.println(start + "已执行");
        try{
            cyclicBarrier.await();
        }catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
    }
}

/*
0 已执行
3 已执行
4 已执行
2 已执行
1 已执行
全部执行完毕
0 已执行
1 已执行
2 已执行
3 已执行
4 已执行
全部执行完毕
.....
*/

更多java基础总结(适合于java基础学习、java面试常规题):

总结篇(1)---复用类

总结篇(2)---多态

总结篇(3)---内部类 (1)内部类的基本概念

总结篇(4)---内部类 (2)内部类之静态内部类

总结篇(5)---内部类 (3)内部类之成员内部类

总结篇(6)---内部类 (4)内部类之局部内部类

总结篇(7)---内部类 (5)内部类之匿名内部类

总结篇(8)---序列化

总结篇(9)---字符串及基本类 (1)字符串及基本类之基本数据类型

总结篇(10)---字符串及基本类 (2)字符串及基本类之java中公共方法及操作

总结篇(11)---字符串及基本类 (3)String对象

总结篇(12)---字符串及基本类 (4)Integer对象

总结篇(13)--- Java注解及元注解

总结篇(14)---JVM(java虚拟机) (1)JVM虚拟机概括

总结篇(15)---JVM(java虚拟机) (2)类加载器

总结篇(16)---JVM(java虚拟机) (3)运行时数据区

总结篇(17)---JVM(java虚拟机) (4)垃圾回收

总结篇(18)---JVM(java虚拟机) (5)垃圾回收算法

总结篇(19)---JVM(java虚拟机) (6)JVM调优

总结篇(20)---反射

总结篇(21)---Java IO

总结篇(22)---Java 进程

总结篇(23)---Java线程及其相关(1)线程介绍

总结篇(24)---Java线程及其相关(2)多线程及其问题

总结篇(25)---Java线程及其相关(3)线程池及其问题

总结篇(26)---Java线程及其相关(4)ThreadLocal

总结篇(27)---Java并发及锁(1)Synchronized

总结篇(28)---Java并发及锁(2)Volatile

总结篇(29)---Java并发及锁(3)Lock

总结篇(30)---Java并发及锁(4)常见锁及分类

总结篇(31)---JUC工具类(1)CountDownLatch

总结篇(32)---JUC工具类(2)CyclicBarrier

总结篇(33)---JUC工具类(3)Semaphore

总结篇(34)---JUC工具类(4)Exchanger

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun cat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值