• JUC-CyclicBarrier基础篇


    JUC-CyclicBarrier基础篇

    1.概念

    CyclicBarrier顾名思义叫做循环栅栏,它是多个线程之间的同步工具类。它的作用就是会让所有线程都等待完成后才会继续下一步行动。它与JUC另一个多个线程之间的同步工具类CountDownLatch类似,但是功能比CountDownLatch更加强大(它们之间的区别请看JUC-CountDownLatch基础篇)
    场景举例:比如现在有一个门,门上有5把锁,此时有五个人需要通过这扇门,它们每个人只能打开一把锁,所以执行情况是,来一个人开一把锁,然后等着,直到最后一个人来了打开了最后一把锁。此时5个人才可以通过这扇门。

    2.常用方法

    CyclicBarrier 提供了一些常用的方法:

    方法说明
    await()parties的值减1,减1后,如果parties不为0,使当前线程进入条件队列进行等待,当前线程被阻塞。线程唤醒条件:1.直到其他的线程调用await将parties减1,让parties的值变成了0。2当前线程发生了中断。3.栅栏被强制打破了(调用了breakBarrier()方法)。
    await(long timeout, TimeUnit unit)带超时时间的await()。超过指定时间,则线程取消阻塞
    getParties()获取当前parties的值
    isBroken()判断栅栏是否被打破了(即是否调用了breakBarrier()方法)
    reset()使得CyclicBarrier回归初始状态。做两件事情:1. 如果有正在等待的线程,则会抛出BrokenBarrierException异常,且这些线程停止等待,继续执行.2.将是否破损标志位broken置为false

    3.例子

    下面代码演示5个线程它们之间相互等待对方的事情都干完了,才接着执行下面的事情

    public class CyclicBarrierTest {
        public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
            //设置parties的初始值为5
            CyclicBarrier cyclicBarrier = new CyclicBarrier(5, new Runnable() {
                @Override
                //栅栏被打开了后所要做的事情
                public void run() {
                    System.out.println("通过了栅栏");
                }
            });
            for (int i = 0; i < 5; i++) {
                new Thread("thread"+i){
                    @Override
                    public void run() {
                        try {
                            System.out.println("线程:" + Thread.currentThread().getName() + "的事情干完了,等待其他的线程都干完它们的事情,才接着干下面的事情");
                            //每调用一次await方法,parties值先减1,如果parties不为0,则阻塞住。
                            //直到parties的值为0,栅栏被打开,才继续往下执行
                            //返回值await表示当前线程调用了await()后,parties当前的值是多少
                            int await = cyclicBarrier.await();
                            System.out.println("线程:" + Thread.currentThread().getName() + "  通过了栅栏,接着干后面的事情");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (BrokenBarrierException e) {
                            e.printStackTrace();
                        }
    
                    }
                }.start();
                System.out.println();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    执行结果:
    CyclicBarrier基础篇例子执行结果

  • 相关阅读:
    数字营销行业如何用CRM做好客户资源沉淀与业务能力传承
    华为机试真题实战应用【赛题代码篇】-按照路径替换二叉树(附Java和C++代码实现)
    CTFshow 信息收集 web16 17 18 19 20
    基于51单片机的教室智能照明控制系统
    技术分享 | 常见接口协议解析
    Qt QGridLayout和QFormLayout案例分析
    云原生之旅 - 8)云原生时代的网关 Ingress Nginx
    【HTML悬浮提示】
    学会根据数据手册指令格式发送数据
    用tidyverse包做探索性数据分析,常用函数总结
  • 原文地址:https://blog.csdn.net/zqj1172102457/article/details/125422251