CyclicBarrier 使用详解

2023-11-01

1、CyclicBarrier 是什么?

从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。

它的作用就是会让所有线程都等待完成后才会继续下一步行动。

举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。

2、怎么使用CyclicBarrier

2.1构造方法

public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
  • parties 是线程数,就是要等待几个线程;
  • Runnable 就是当这几个线程都走到这一步的时候最后一个线程要执行这一个任务,执行完以后,一起往下执行

2.2 重要方法

public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
  • 线程调用 await() 表示自己已经到达栅栏;
  • BrokenBarrierException 表示栅栏已经被破坏,破坏的原因可能是其中一个线程 await() 时被中断或者超时

2.3 基本使用

2.3.1 代码实现

public class CyclicBarrierDemo {

    static class TaskThread extends Thread {
        
        CyclicBarrier barrier;
        
        public TaskThread(CyclicBarrier barrier) {
            this.barrier = barrier;
        }
        
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                System.out.println(getName() + " 到达栅栏 A");
                barrier.await();
                System.out.println(getName() + " 冲破栅栏 A");
                
                Thread.sleep(2000);
                System.out.println(getName() + " 到达栅栏 B");
                barrier.await();
                System.out.println(getName() + " 冲破栅栏 B");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        int threadNum = 5;
        CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
            
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " 完成最后任务");
            }
        });
        
        for(int i = 0; i < threadNum; i++) {
            new TaskThread(barrier).start();
        }
    }
    
}

结果

Thread-1 到达栅栏 A
Thread-3 到达栅栏 A
Thread-0 到达栅栏 A
Thread-4 到达栅栏 A
Thread-2 到达栅栏 A
Thread-2 完成最后任务
Thread-2 冲破栅栏 A
Thread-1 冲破栅栏 A
Thread-3 冲破栅栏 A
Thread-4 冲破栅栏 A
Thread-0 冲破栅栏 A
Thread-4 到达栅栏 B
Thread-0 到达栅栏 B
Thread-3 到达栅栏 B
Thread-2 到达栅栏 B
Thread-1 到达栅栏 B
Thread-1 完成最后任务
Thread-1 冲破栅栏 B
Thread-0 冲破栅栏 B
Thread-4 冲破栅栏 B
Thread-2 冲破栅栏 B
Thread-3 冲破栅栏 B

2.3.2 使用场景

可以用于多线程计算数据,最后合并计算结果的场景。

2.3.3 CyclicBarrier 与 CountDownLatch 区别

  • CountDownLatch 是一次性的,CyclicBarrier 是可循环利用的
  • CountDownLatch 参与的线程的职责是不一样的,有的在倒计时,有的在等待倒计时结束。CyclicBarrier 参与的线程职责是一样的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CyclicBarrier 使用详解 的相关文章

  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch

随机推荐

  • 第五讲----bs4

    bs4简介 基本概念 Beautiful Soup 是可以从HTML或XML文件中提取数据的网页信息提取库 安装 pip install lxml pip install bs4 File bs4快速入门 py import bs4 fro
  • VMware导入虚拟系统

    导入虚拟系统的前提是安装好VMware软件 首先下载虚拟系统文件 随后点击左上角的文件按钮 点击打开 选择 ovf文件 点击打开 3 修改系统存放的地址 因为虚拟系统比较大 不建议存放在C盘 4 随后等待软件加载系统 5 加载完毕之后 在软
  • java判断文本字符集

    这是一个sourceforge项目 能够判断指定文本或流的字符集 下面是这个库的简单封装 package me jor util import info monitorenter cpdetector io ByteOrderMarkDet
  • chatgpt赋能python:用Python轻松给手机用户发送短信——优秀的工具在手,无限可能!

    用Python轻松给手机用户发送短信 优秀的工具在手 无限可能 作为一个有10年Python编程经验的工程师 我想分享一下如何用Python给手机用户发送短信 Python是目前非常流行的编程语言之一 它可以轻松地完成很多任务 而给用户发送
  • Unity使用脚本模拟Button按下

    目的 想用脚本来模拟Button的按下动作 button上绑定的有方法 自动调用方法 正常操作是鼠标点击按钮 using UnityEngine using UnityEngine UI using System Collections u
  • 记录js-判断一串数字数组,是否是连续的

    场景 假如有一组数组 如 1 2 3 4 5 6 可以看出这数组是连续的 那么如 1 2 3 5 6 这串数组就不是连续的了 用js写判断方法 实现代码 判断一串数字是否是连续的 function isContinuityNum num l
  • Docker 网络互相访问

    对于docker容器 我们知道它是沙箱隔离的 每一个docker容器都是独立运行的 相当于一个独立的虚拟机 所以他们只能进行网路访问 如果我们使用docker run时启动容器 没有指定网路 net参数 默认使用的bridge的网络类型 查
  • wirshark发包工具源码

    需要下载https link csdn net target https 3A 2F 2Fwww winpcap org 2Finstall 2Fbin 2FWpdPack 4 1 2 zip开源库并且使用 目前只能发送udp的码流 def
  • 主流ETL工具汇总

    一 kettle 说明 是国外开源ETL工具 支持数据库 FTP 文件 rest接口 hdfs hive等平台的灵敏据进行抽取 转换 传输等操作 Java编写跨平台 C S架构 不支持浏览器模式 特点 易用性 有可视化设计器进行可视化操作
  • Go语言实训二:Go语言基础知识

    第1关 Go语言基本数据类型 任务描述 用 Go 语言写一个程序 把 int 类型强制转化为 rune 类型 并验证原生的 rune 类型和转换后的 rune 类型是否具有可比较性 相关知识 介绍 在 Go 语言中 数据类型用于声明函数和变
  • 调参经验

    1 假设一次训练有10个epoch 可能会出现以下情况 训练好一次模型去测试 测试的准确率为0 92 又去训练一次模型 不是在之前训练模型的基础上 而是单独进行一次训练 模型训练好去测试 测试准确率为0 93或者0 89 如果我改变一个模型
  • JAVA字符串格式化-String.format()和MessageFormat的使用

    String format 常规类型的格式化 String类的format 方法用于创建格式化的字符串以及连接多个字符串对象 熟悉C语言的同学 应该记得C语言的sprintf 方法 两者有类似之处 format 方法有两种重载形式 form
  • TCP&UDP

    TCP 面向连接的服务 可靠的进程到进程的通信协议 因为TCP里面封装了端口号 端口号就意味着一个服务 进程 应用场景 如 文件传输 HTTP应用层协议 UDP 无连接服务 不可靠的传输协议 应用场景 广播 早期的QQ 视频传输等 ACK
  • 2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)

    题目简评 看下来C题是三道题目里简单一些的 考察的点比较综合 偏数据分析 涉及预测模型和运筹优化 线性规划 还设了一问开放型问题 适合新手入门 发挥空间大 题目分析与思路 背景 在生鲜商超中 一般蔬菜类商品的保鲜期都比较短 且品相随销售时间
  • Groovy 的SQL模块

    Groovy的SQL模块提供了对JDBC的抽象 让我们使用JDBC更简单 相关类在groovy sql包下 本文参考自Working with a relational database 一些代码引用了官方文档 需要了解详细信息请参见原文
  • [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web applica...

    1 06 Aug 2019 22 01 22 261 信息 localhost startStop 1 org apache catalina startup HostConfig deployDirectory Deploying web
  • TCP/IP网络江湖——数据链路层的协议与传承(数据链路层中篇:数据链路层的协议与帧)

    0 引言 网络江湖 宛如千年武林 承载着代代传承的文化和传统 在这个广袤的江湖之中 数据链路层犹如武林门派 代代传承着网络通信的精华 这一部分将带领我们深入探讨数据链路层的协议与传承 揭示其在网络江湖中的精彩故事 就如同江湖中的武者需要基本
  • java将list转化为string

    可以使用Java中的join 方法将List转化为String 例如 List
  • 颜水成发了个「简单到令人尴尬」的视觉模型,证明Transformer威力源自其整体架构...

    梦晨 发自 凹非寺量子位 报道 公众号 QbitAI Transformer做视觉取得巨大成功 各大变体频频刷榜 其中谁是最强 早期人们认为是其中的注意力机制贡献最大 对注意力模块做了很多改进 后续研究又发现不用注意力换成Spatial M
  • CyclicBarrier 使用详解

    1 CyclicBarrier 是什么 从字面上的意思可以知道 这个类的中文意思是 循环栅栏 大概的意思就是一个可循环利用的屏障 它的作用就是会让所有线程都等待完成后才会继续下一步行动 举个例子 就像生活中我们会约朋友们到某个餐厅一起吃饭