循环栅栏:CyclicBarrier

news2024/9/24 11:32:04

CyclicBarrier可以理解为循环栅栏,栅栏就是一种障碍物,
比如通常在私人宅院的周围就可以围上一圈栅栏,阻止闲杂人等入内。
这里当然就是用来阻止线程继续执行,要求线程在栅栏外等待。
前面的Cyclic意为循环,也就是说这个计数器可以反复使用。
比如,我们将计数器设置为10,那么凑齐第一批10个线程后,计数器就会归零,
接着凑齐下一批10个线程,这就是循环栅栏内在的含义。

CyclicBarrier的使用场景也很丰富。比如,司令下达命令,要求10个士兵一起去
完成一项任务。这时就会要求10个士兵集合报到,接着,一起雄赳赳,气昂昂地去执行任务。
当10个士兵把自己手上的任务都执行完成了,那么司令才对外宣布,任务完成。

CyclicBarrier比CountDownLatch稍微强大一些,
它可以接收一个参数作为barrierAction.
所谓barrierAction就是当计数器一次计数完成后,
系统会执行的动作。
其中parties表示计数总数,也就是参与的线程总数。

public class CyclicBarrierDemo {
    public static class Sodier implements Runnable{
        private String soldier;
        private final CyclicBarrier cyclic;

        Sodier(CyclicBarrier cyclic,String soldierName){
            this.cyclic = cyclic;
            this.soldier = soldierName;
        }
        public void run() {
            try{
                cyclic.await();
                doWork();
                cyclic.await();
            } catch (InterruptedException e){
                e.printStackTrace();
            } catch (BrokenBarrierException e){
                e.printStackTrace();
            }
        }
        void doWork(){
            try {
                Thread.sleep(Math.abs(new Random().nextInt()%10000));
            } catch (InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(soldier+":任务完成");
        }
    }
    public static class BarrierRun implements Runnable{
        boolean flag;
        int N;
        public BarrierRun(boolean flag,int N){
            this.N = N;
            this.flag = flag;
        }
        public void run() {
            if(flag){
                System.out.println("司令:[士兵"+ N +"个,任务完成!]");
            } else{
                System.out.println("司令:[士兵"+ N +"个,集合完毕!]");
                flag = true;
            }
        }
    }
    public static void main(String[] args) throws InterruptedException{
        final int N = 10;
        Thread[] allSoldier = new Thread[N];
        boolean flag = false;
        CyclicBarrier cyclic = new CyclicBarrier(N, new BarrierRun(flag,N));
        System.out.println("集合队伍!");
        for (int i =0;i< N; ++i){
            System.out.println("士兵"+i+"报道!");
            allSoldier[i] = new Thread(new Sodier(cyclic,"士兵"+i));
            allSoldier[i].start();
        }
    }
}

创建CyclicBarrier实例,并将计数器设置为10,要求在计数器到达指标时,
执行run()方法。每个士兵线程都会执行run方法。
在第18行cyclic.await()每个士兵都会等待,直到所有的士兵都集合完毕。
集合完毕意味着CyclicBarrier的一次计数完成,当再一次调用CyclicBarrier.await
方法时,会进行下一次计数。doWork();模拟了士兵的任务。
当一个士兵任务执行完,他就会要求CylicBarrier开始下一次计数,
这次计数主要目的是监控是否所有的士兵都已经完成了任务。
一旦任务全部完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1324601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【轻量化篇】YOLOv8改进实战 | 更换主干网络 Backbone 之 RepGhostnet,重参数化实现硬件高效的Ghost模块

YOLOv8专栏导航:点击此处跳转 前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操…

cpp_04_类_对象_this指针_常对象_常(成员)函数

1 类 1.1 类的定义 类的作用是抽象事物&#xff08;抽取事物特征&#xff09;的规则。 类的外化表现是用户自定义的复合数据类型&#xff08;包括成员变量、成员函数&#xff09;&#xff1a; 成员变量用于表达事物的属性&#xff0c;成员函数用于表达事物的行为。 类的表现…

基于LSTM的情感分析

本文以情感分析为主题&#xff0c;介绍了其在自然语言处理中的重要性以及应用场景。传统的循环神经网络&#xff08;RNN&#xff09;在处理长序列时存在问题&#xff0c;而引入了记忆细胞、输入门、输出门和遗忘门的LSTM模型能够有效解决这一问题。数据集和预处理在机器学习和自…

内外联动——记建行江门鹤山支行营业部成功堵截诈骗

“谢谢&#xff0c;太谢谢你们了&#xff01;真没想到&#xff0c;现在骗子手段这么高了&#xff0c;冒充我孙儿太像了。要不是你们一直拦着我&#xff0c;差点就把养老钱汇出去了&#xff01;”近日&#xff0c;在建行江门鹤山支行营业部大厅里&#xff0c;一位老人家肖婆婆对…

鸿蒙Harmony4.0开发-ArkTS基础知识运用

概念 1.渲染控制语法&#xff1a; 条件渲染&#xff1a;使用if/else进行条件渲染。 Column() {if (this.count > 0) {Text(count is positive)} }循环渲染&#xff1a;开发框架提供循环渲染&#xff08;ForEach组件&#xff09;来迭代数组&#xff0c;并为每个数组项创建…

王道考研--》单链表课后习题C语言代码实现(冲刺)

考研是许多计算机科学专业学生追求高学历、寻求更好就业前景的途径。在考研过程中&#xff0c;数据结构是一个非常重要的科目&#xff0c;而代码实现题更是其中的难点之一。在这篇文章中&#xff0c;我们将探讨如何通过实现数据结构代码问题来提升考研成绩。无论您是否有编程经…

重温经典struts1之自定义转换器及注册的两种方式(Servlet,PlugIn)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 Struts的ActionServlet接收用户在浏览器发送的请求&#xff0c;并将用户输入的数据&#xff0c;按照FormBean中定义的数据类型&#xff0c;赋值给FormBean中每个变量&a…

YOLOv8改进 | 2023注意力篇 | HAttention(HAT)超分辨率重建助力小目标检测 (全网首发)

一、本文介绍 本文给大家带来的改进机制是HAttention注意力机制&#xff0c;混合注意力变换器&#xff08;HAT&#xff09;的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要&#xff0c;而自注意力则关注于图…

【Python动漫系列】小香香(完整代码)

文章目录 环境需求完整代码程序分析系列文章环境需求 python3.11.4及以上版本PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.…

《论文阅读28》Unsupervised 3D Shape Completion through GAN Inversion

GAN&#xff0c;全称GenerativeAdversarialNetworks&#xff0c;中文叫生成式对抗网络。顾名思义GAN分为两个模块&#xff0c;生成网络以及判别网络&#xff0c;其中 生成网络负责根据随机向量产生图片、语音等内容&#xff0c;产生的内容是数据集中没有见过的&#xff0c;也可…

C语言—每日选择题—Day56

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 以下叙述中正确的是&#xff08;&#xff09; A&#xff1a;\0 表示字符 0 B&#xff1a;"a" 表示一个字符常量 C&#xff1a;表…

机器学习与深度学习傻傻分不清?快来!

导读&#xff1a;本文探讨机器学习和深度学习之间的关键区别和相互联系&#xff0c;目的是为大家提供一个清晰的框架&#xff0c;帮助大家理解这两种技术的特点、应用场景以及选择适当方法的依据。&#xff08;理论辨析&#xff0c;无实践代码&#xff0c;放心食用&#xff09;…

js之零碎工具(四)

一、数组的去重 简单类型的去重 let arr [1, 2, 2, 3, 4, 4, 5]; let uniqueArr [...new Set(arr)]; console.log(uniqueArr); // 输出&#xff1a;[1, 2, 3, 4, 5]在这个例子中&#xff0c;我们首先创建了一个新的 Set 对象&#xff0c;并将数组 arr 作为参数传递给 Set 的…

令人惊叹的代码技巧

在编程世界中&#xff0c;有一些令人惊叹的代码技巧和巧妙的实现方式。以下是一些我见过的令人印象深刻的代码技巧&#xff1a; 函数式编程魔法&#xff1a; 使用函数式编程的一些特性&#xff0c;比如高阶函数、匿名函数和Lambda表达式&#xff0c;可以使代码更为简洁、易读。…

C# 使用NUnit进行单元测试

写在前面 NUnit是一个开源的.Net单元测试框架&#xff0c;经常被用来在.Net体系下做白盒测试。 NUnit.org GitHub 本文记录一个简单的使用NUnit进行单元测试的完整流程。 代码实现 新建一个目标类库NUnitTester&#xff0c;添加待测试的类文件&#xff0c;内容如下&#…

hyper-v ubuntu2204指定静态ip地址

虚拟机静态IP设置 虚拟机每次重新启动&#xff0c;都会动态分配IP&#xff0c;这导致我们无法使用一个固定的ip连接到虚拟机内部。解决该问题的最直接有效的办法就是给虚拟机绑定2张网卡&#xff0c;一张用于连接外网、一张用于连接内网。 init 0 关机&#xff0c;也可以从管…

Python正则表达式与replace函数,空格问题轻松搞定!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据处理中&#xff0c;清理文本数据是一个常见而关键的任务。空格是文本中常见的干扰项之一&#xff0c;可能存在于字符串的开头、结尾或中间。Python提供了正则表达式和replace函数两种强大的工具&#xff0…

Unity中Shader平移变换

文章目录 前言方式一&#xff1a;对顶点本地空间下的坐标进行相加平移1、在属性面板定义一个四维变量记录在 xyz 上平移多少。2、在常量缓冲区进行申明3、在顶点着色器中&#xff0c;在进行其他坐标转化之前&#xff0c;对模型顶点本地空间下的坐标进行转化4、我们来看看效果 方…

Pixel Nerf代码阅读

Input&#xff1a; 图像的 分辨率是 300*400&#xff1b; 每个场景里面有 49张 Training 的图像。 SB&#xff1a; scene batch 场景的个数&#xff1b; 4 NV&#xff1a; number input &#xff0c;每个场景的视角&#xff0c;也就是图像的数量&#xff1b; 49 每条光线首先…

被我们忽略的HttpSession线程安全问题

1. 背景 最近在读《Java concurrency in practice》(Java并发实战)&#xff0c;其中1.4节提到了Java web的线程安全问题时有如下一段话&#xff1a; Servlets and JPSs, as well as servlet filters and objects stored in scoped containers like ServletContext and HttpSe…