千家信息网

Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
千家信息网最后更新 2026年10月31日Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成

Java循环屏障中CyclicBarrier如何实现多线程分段等待执行完成,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言

工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段。当然你使用线程计数可以实现,只是不够优雅。

所以我即:Java 多线程等待优雅的实现方式之Phaser同步屏障

之后再提供一个循环屏障,CyclicBarrier,更优雅的实现工具。

Maven依赖

可以依赖,也可以不依赖,只是代码要稍微多一些,最好添加。

            org.projectlombok            lombok            true                            cn.hutool            hutool-all            5.7.15        

代码

不废话,上代码。

package com.huyi.csdn.tools; import cn.hutool.core.thread.ThreadUtil;import lombok.Getter;import lombok.Setter; import java.text.MessageFormat;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.*; /** * @Program: csdn @ClassName: CyclicBarrierUtil @Author: huyi @Date: 2021-11-07 17:09 @Description: * 循环屏障工具 @Version: V1.0 */public class CyclicBarrierUtil {  public static final ExecutorService executorService = Executors.newFixedThreadPool(50);   @Getter  @Setter  public static class SegmentedTask {    private Runnable start;    private Runnable middle;    private Runnable end;     public SegmentedTask(Runnable start, Runnable middle, Runnable end) {      this.start = start;      this.middle = middle;      this.end = end;    }  }   /**   * 提交任务   *   * @param tasks 参数   */  public static void submit(List tasks) {    CyclicBarrier cyclicBarrier = new CyclicBarrier(tasks.size() + 1);    try {      tasks.forEach(          x -> {            executorService.submit(                () -> {                  try {                    x.getStart().run();                    cyclicBarrier.await();                    x.getMiddle().run();                    cyclicBarrier.await();                    x.getEnd().run();                    cyclicBarrier.await();                  } catch (InterruptedException | BrokenBarrierException e) {                    e.printStackTrace();                  }                });          });      cyclicBarrier.await();      System.out.println("初始任务已经全部完成");      cyclicBarrier.await();      System.out.println("中间任务已经全部完成");      cyclicBarrier.await();      System.out.println("最终任务已经全部完成");    } catch (InterruptedException | BrokenBarrierException e) {      e.printStackTrace();    }  }   public static void destroy() {    System.out.println("摧毁线程池");    executorService.shutdown();  }}

代码说明

1、构造了一个分段任务实体类,成员有3段Runnable。

2、不同段的Runnable完成后会等待其他线程完成该段任务。

验证代码

  public static void main(String[] args) {    Random random = new Random();    List tasks = new ArrayList<>();    for (int i = 1; i < 11; i++) {      int finalI = i;      tasks.add(          new SegmentedTask(              () -> {                ThreadUtil.sleep(random.nextInt(10), TimeUnit.SECONDS);                System.out.println(                    Thread.currentThread() + ":" + MessageFormat.format("第{0}军团已经开始推进!", finalI));              },              () -> {                ThreadUtil.sleep(random.nextInt(10), TimeUnit.SECONDS);                System.out.println(                    Thread.currentThread() + ":" + MessageFormat.format("第{0}军团已经正在进攻!", finalI));              },              () -> {                ThreadUtil.sleep(random.nextInt(10), TimeUnit.SECONDS);                System.out.println(                    Thread.currentThread() + ":" + MessageFormat.format("第{0}军团已经攻陷阵地!", finalI));              }));    }    CyclicBarrierUtil.submit(tasks);    ThreadUtil.sleep(35, TimeUnit.SECONDS);    CyclicBarrierUtil.destroy();  }

验证结果

E:\Java\jdk1.8.0_40\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=5831:E:\Program Files\JetBrains\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath E:\Java\jdk1.8.0_40\jre\lib\charsets.jar;E:\Java\jdk1.8.0_40\jre\lib\deploy.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_40\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_40\jre\lib\javaws.jar;E:\Java\jdk1.8.0_40\jre\lib\jce.jar;E:\Java\jdk1.8.0_40\jre\lib\jfr.jar;E:\Java\jdk1.8.0_40\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_40\jre\lib\jsse.jar;E:\Java\jdk1.8.0_40\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_40\jre\lib\plugin.jar;E:\Java\jdk1.8.0_40\jre\lib\resources.jar;E:\Java\jdk1.8.0_40\jre\lib\rt.jar;C:\Users\yi\IdeaProjects\csdn\target\classes;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.5.6\spring-boot-starter-web-2.5.6.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-starter\2.5.6\spring-boot-starter-2.5.6.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.5.6\spring-boot-starter-logging-2.5.6.jar;C:\Users\yi\.m2\repository\ch\qos\logback\logback-classic\1.2.6\logback-classic-1.2.6.jar;C:\Users\yi\.m2\repository\ch\qos\logback\logback-core\1.2.6\logback-core-1.2.6.jar;C:\Users\yi\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;C:\Users\yi\.m2\repository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;C:\Users\yi\.m2\repository\org\slf4j\jul-to-slf4j\1.7.32\jul-to-slf4j-1.7.32.jar;C:\Users\yi\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\yi\.m2\repository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.5.6\spring-boot-starter-json-2.5.6.jar;C:\Users\yi\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.12.5\jackson-databind-2.12.5.jar;C:\Users\yi\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.5\jackson-annotations-2.12.5.jar;C:\Users\yi\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.12.5\jackson-core-2.12.5.jar;C:\Users\yi\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.5\jackson-datatype-jdk8-2.12.5.jar;C:\Users\yi\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.5\jackson-datatype-jsr310-2.12.5.jar;C:\Users\yi\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.5\jackson-module-parameter-names-2.12.5.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.5.6\spring-boot-starter-tomcat-2.5.6.jar;C:\Users\yi\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.54\tomcat-embed-core-9.0.54.jar;C:\Users\yi\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.54\tomcat-embed-el-9.0.54.jar;C:\Users\yi\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.54\tomcat-embed-websocket-9.0.54.jar;C:\Users\yi\.m2\repository\org\springframework\spring-web\5.3.12\spring-web-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\spring-beans\5.3.12\spring-beans-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\spring-webmvc\5.3.12\spring-webmvc-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\spring-aop\5.3.12\spring-aop-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\spring-context\5.3.12\spring-context-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\spring-expression\5.3.12\spring-expression-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-devtools\2.5.6\spring-boot-devtools-2.5.6.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot\2.5.6\spring-boot-2.5.6.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.5.6\spring-boot-autoconfigure-2.5.6.jar;C:\Users\yi\.m2\repository\org\springframework\boot\spring-boot-configuration-processor\2.5.6\spring-boot-configuration-processor-2.5.6.jar;C:\Users\yi\.m2\repository\org\projectlombok\lombok\1.18.22\lombok-1.18.22.jar;C:\Users\yi\.m2\repository\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;C:\Users\yi\.m2\repository\org\springframework\spring-core\5.3.12\spring-core-5.3.12.jar;C:\Users\yi\.m2\repository\org\springframework\spring-jcl\5.3.12\spring-jcl-5.3.12.jar;C:\Users\yi\.m2\repository\cn\hutool\hutool-all\5.7.15\hutool-all-5.7.15.jar;C:\Users\yi\.m2\repository\com\google\guava\guava\31.0.1-jre\guava-31.0.1-jre.jar;C:\Users\yi\.m2\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;C:\Users\yi\.m2\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;C:\Users\yi\.m2\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;C:\Users\yi\.m2\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;C:\Users\yi\.m2\repository\com\google\errorprone\error_prone_annotations\2.7.1\error_prone_annotations-2.7.1.jar;C:\Users\yi\.m2\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar com.huyi.csdn.tools.CyclicBarrierUtil
Thread[pool-1-thread-9,5,main]:第9军团已经开始推进!
Thread[pool-1-thread-10,5,main]:第10军团已经开始推进!
Thread[pool-1-thread-8,5,main]:第8军团已经开始推进!
Thread[pool-1-thread-3,5,main]:第3军团已经开始推进!
Thread[pool-1-thread-7,5,main]:第7军团已经开始推进!
Thread[pool-1-thread-5,5,main]:第5军团已经开始推进!
Thread[pool-1-thread-6,5,main]:第6军团已经开始推进!
Thread[pool-1-thread-4,5,main]:第4军团已经开始推进!
Thread[pool-1-thread-1,5,main]:第1军团已经开始推进!
Thread[pool-1-thread-2,5,main]:第2军团已经开始推进!
初始任务已经全部完成
Thread[pool-1-thread-4,5,main]:第4军团已经正在进攻!
Thread[pool-1-thread-6,5,main]:第6军团已经正在进攻!
Thread[pool-1-thread-5,5,main]:第5军团已经正在进攻!
Thread[pool-1-thread-8,5,main]:第8军团已经正在进攻!
Thread[pool-1-thread-7,5,main]:第7军团已经正在进攻!
Thread[pool-1-thread-9,5,main]:第9军团已经正在进攻!
Thread[pool-1-thread-1,5,main]:第1军团已经正在进攻!
Thread[pool-1-thread-2,5,main]:第2军团已经正在进攻!
Thread[pool-1-thread-3,5,main]:第3军团已经正在进攻!
Thread[pool-1-thread-10,5,main]:第10军团已经正在进攻!
中间任务已经全部完成
Thread[pool-1-thread-7,5,main]:第7军团已经攻陷阵地!
Thread[pool-1-thread-5,5,main]:第5军团已经攻陷阵地!
Thread[pool-1-thread-2,5,main]:第2军团已经攻陷阵地!
Thread[pool-1-thread-8,5,main]:第8军团已经攻陷阵地!
Thread[pool-1-thread-3,5,main]:第3军团已经攻陷阵地!
Thread[pool-1-thread-9,5,main]:第9军团已经攻陷阵地!
Thread[pool-1-thread-10,5,main]:第10军团已经攻陷阵地!
Thread[pool-1-thread-4,5,main]:第4军团已经攻陷阵地!
Thread[pool-1-thread-1,5,main]:第1军团已经攻陷阵地!
Thread[pool-1-thread-6,5,main]:第6军团已经攻陷阵地!
最终任务已经全部完成
摧毁线程池

Process finished with exit code 0

OK,完美。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

军团 正在 阵地 进攻 任务 线程 屏障 代码 循环 优雅 只是 工具 帮助 验证 不同 清楚 上代 不够 内容 前言 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云信互联网科技有限公司 关于新基建和互联网科技 狮子座互联网科技 互联网 卓越科技 电子科技大学互联网 亿账通互联网科技 重庆科技学院互联网 中国科技互联网公司收入 港股科技和互联网 崇明区互联网教育科技售后服务 苏州铭阳互联网科技有限公司 如何创新互联网科技 互联网科技大赛获奖感言 南通创西澳互联网科技有限公司 黑云互联网科技有限公司 南京一网一红互联网科技有限公司 陕西九四连强互联网科技有限公司 互联网科技对化妆品行业 青岛互联网科技园 互联网科技创业有什么好项目 互联网科技工作委员会毛军 腾讯科技 互联网女皇 碳银互联网科技有限公司 上海亿帐通互联网科技 互联网科技类展会 半导体行业属于互联网高科技类吗 上海同邻互联网科技有限公司规模 福建互联网展示科技馆设计 版纳互联网科技选哪家 黑龙江互联网科技公司
0