图解CyclicBarrier运动员接力赛

作者: 叫练

图解游戏规则


大家都知道运动员短跑接力赛,今天们并不是讲接力赛,们讲”接力协作赛“,需要们重新定义下游戏规则:如下图所示

image.png

现在有运动员A,B,先定义游戏规则:赛道目前是300米,每个运动员在跑完第一个100米时,需要等待其他运动员跑完第一个100米,比如运动员A先跑完100米,而此时运动员B只跑了95米,那运动员A必须要等待运动员B跑完剩余的5米,然后再一起接着跑第2个100米,第三个100米,规则也和第1个100米类同,最后们可以得出一个结论 ,两个运动员跑完300米赛道,最长需要花多少时间。【本案例纯属虚构,为了讲清楚CyclicBarrier】。下面们用代码模拟执行。

案例说明


import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * @author :jiaolian
 * @date :Created in 2021-03-01 14:56
 * @description:回环屏障测试--接力赛
 * @modified By:
 * 公众号:叫练
 */
public class CyclicBarrierTest {
    private static final int THREAD_COUNT = 2;
    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{
        System.out.println(Thread.currentThread().getName()+"冲破屏障");
    });
    private static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
    public static void main(String[] args) {
        Runnable myTask = new MyTask();
        //初始化两个运动员
        for (int i=0 ;i<THREAD_COUNT; i++) {
            executorService.submit(myTask);
        }
    }
    private static class MyTask implements Runnable {
        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread().getName()+"第1个100米");
                cyclicBarrier.await();
                System.out.println(Thread.currentThread().getName()+"第2个100米");
                cyclicBarrier.await();
                System.out.println(Thread.currentThread().getName()+"第3个100米");
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

如上代码:线程池模拟执行两个运动员,每个运动员执行完每个100米必须等待另一个运动员,执行结果和们设想一致,如下图所示。其中pool-1-thread-1,pool-1-thread-2分别表示运动员A,运动员B。CyclicBarrier初始化参数中有一个Runnable是用来冲破屏障回调的函数。

image.png

比较CountDownLatch


CyclicBarrier 中文释义“回环屏障” ,每个线程调用await,计数器会减1,如果此时计数器不为0,线程会阻塞,如果计数器为0说明需要冲破屏障,会唤醒之前被阻塞的线程,并会重置计数器。源码实现中用到了独占锁和条件队列控制线程的进队和出队,CountDownLatch用到的是共享锁,虽然实现不一样,底层都是AQS,相对于CountDownLatch来说,CyclicBarrier是它的补充,功能更强大。

总结


今天们介绍了CyclicBarrier ,整理出来希望能对你有帮助,写的比不全,同时还有许多需要修正的地方,希望亲们加以指正和点评,喜欢的请点赞加关注哦。点关注,不迷路, 是【叫练公众号 ,微信号【jiaolian123abc】边叫边练。

[] ) [](top

原文创作:叫练

原文链接:https://www.cnblogs.com/jiaolian/p/14464636.html

文章列表

更多推荐

更多
  • Ansible2安全自动化-十、编写安全测试的 Ansible 模块 开始使用 hello world Ansible 模块,密码,建立开发环境,计划和要记住的内容,OWASP ZAP 模块,使用 Docker 创建 ZAP,创建易受攻击的应用,Ansible 模块模板,[计]元数据,记录模块,源代码模板
    Apache CN

  • Ansible2安全自动化-十一、可靠的安全最佳实践、参考和进一步阅读 十一、可靠的安全最佳实践、参考和进一步使用 Ansible 的保管库,如何对变量和文件使用 Ansible Vault,Ansible Vault 单一加密变量,Ansible 拱顶在 Ansible 塔中的应用,设置和使用可扫描集群,
    Apache CN

  • Ansible2安全自动化-九、用于取证收集和恶意软件分析的自动化实验室设置 为隔离环境的实验室创建可行的行动手册,收集文件和域恶意软件识别和分类,病毒总应用编程接口工具设置,病毒总应用编程接口扫描恶意软件样本,设置布谷鸟沙盒环境,设置布谷鸟主机,设置布谷鸟客人,使用 Ansible 行动手册提交样品和报告,使用
    Apache CN

  • Ansible2安全自动化-八、Docker 容器的持续安全扫描 理解连续安全概念,使用 Ansible 自动化 Docker 容器的漏洞评估,安全 Docker 工作台,克莱尔,为了 Docker 安全,使用 Ansible Tower 进行计划扫描,锚,锚定的引擎服务设置,锚定 cli 扫描仪,使
    Apache CN

  • Ansible2安全自动化-四、日志监控和无服务器自动防御(AWS 中的弹性栈) 四、日志监控和无服务器自动防御AWS 中的弹性栈弹性叠层介绍,弹性搜索,logstash(日志记录),马纳人,搜索,我们为什么要使用弹性栈进行安全监控和警报?,设置弹性栈的先决条件,设置弹性栈,Logstash 集成,马纳人,弹性纤维,
    Apache CN

  • Ansible2安全自动化-五、使用 OWASP ZAP 实现网络应用安全测试自动化 安装 OWASP ZAP,安装 Docker 运行时,OWASP ZAP 坞站容器设置,处理容器的专用工具——Ansible 容器,配置 ZAP 基线扫描,运行易受攻击的应用容器,运行 OWASP 扫描程序基线扫描,针对网络应用和网站的
    Apache CN

  • Ansible2安全自动化-六、利用 Nessus 进行漏洞扫描 尼斯介绍,安装 Nessus 进行漏洞评估,配置 Nessus 进行漏洞扫描,对网络执行扫描,基本网络扫描,使用自动扫描运行扫描,设置自动用户,使用自动扫描运行扫描,列出当前可用的扫描和标识,使用扫描标识启动指定的扫描,存储结果,安装
    Apache CN

  • Ansible2安全自动化-七、应用和网络的安全强化 使用 CIS、STIGs 和 NIST 等基准强化安全性,使用 Ansible 行动手册强化基线操作系统,STIGs 在 Linux 主机自动安全强化方面的可替代角色,使用 Ansible Tower 对 OpenSCAP 进行持续的安
    Apache CN

  • Ansible2安全自动化-三、使用加密自动备份设置加固 WordPress WordPress 命令行界面,为什么要为这种设置负责?,一个完整的 WordPress 安装步骤,正在设置 nginx web 服务器,设置先决条件,建立 MySQL 数据库,为 WordPress 安装程序安装 PHP,使用命令行界
    Apache CN

  • Ansible2安全自动化-二、Ansible Tower、Jenkins 和其他自动化工具 调度工具支持自动化的下一个抽象,起床跑步,设置可平移的塔,设置 Jenkins,设置运行平台,安全自动化用例,添加行动手册,Ansible 的塔式配置,Jenkins Ansible 集成配置,运行平台配置,认证和数据安全,RBAC 代
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多