CyclicBarrier 和 ThreadPoolExecutor搭配使用

Java并发编程系列10:CyclicBarrier+Executors+Runnable结合,多线程执行(1) Java(79):CyclicBarrier+Executors+Runnable结合,实现多线程安全 https://blog.youkuaiyun.com/fen_fen/article/details/121649731 一、需求和如何实现 需求:需要使用Java代码编写性能测试程序针对单独的算法进行性能测试 想法:通过CyclicBarrier+Executors+Runnable结合,实现多线程下的算法性能测试 实现方式如下: CyclicBarrier+线程池的调用方式 1、定义一个 Runnab. 阅读详情

这里写自定义目录标题

CyclicBarrier

多线程执行的时候确保所有线程到达同一位置后再执行。

ThreadPoolExecutor

线程池,避免频繁新建现场的损耗。

代码示例

package com.fancv.concurrent.ThreadWait;

import java.util.concurrent.*;

/**
 * 要求是一组任务
 *  3 个线程 协作完成一个任务,3个线程都执行完成了 主线程打印任务结果
 *  重试3次
 */
public class CyclicBarrierDemo_2 {

    ThreadPoolExecutor threadPoolExecutor =new ThreadPoolExecutor(2, 9,
            10L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>(3));
     CyclicBarrier cyclicBarrier = new CyclicBarrier(3,()->{
        System.out.println(Thread.currentThread().getName()+"完成了一组之后 回调执行");
    });

    public static void main(String[] args) throws InterruptedException {
        CyclicBarrierDemo_2 cyclicBarrierDemo_2=new CyclicBarrierDemo_2();
        cyclicBarrierDemo_2.threeTime();
        //执行shutdown
        if (!cyclicBarrierDemo_2.threadPoolExecutor.isShutdown()) {
            cyclicBarrierDemo_2.threadPoolExecutor.shutdown();
            System.out.println("start shutdown ...");
            //等待执行结束
            cyclicBarrierDemo_2.threadPoolExecutor.awaitTermination(16, TimeUnit.MINUTES);
        }
    }


    void threeTime(){
        for (int i=0;i<3;i++){
            threadPoolExecutor.submit(()->{
                System.out.println("A");
                try {
                    Thread.sleep(100);
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("A 执行完毕");
            });
            threadPoolExecutor.submit(()->{
                System.out.println("B");
                try {
                    Thread.sleep(1000);
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("B 执行完毕");
            });
            threadPoolExecutor.submit(()->{
                System.out.println("C");
                try {
                    Thread.sleep(1000);
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("C 执行完毕");
            });
        }
    }

}

如果线程池参数配置为无界队列那么整个逻辑无法执行,CyclicBarrier 等待三个线程执行完毕,线程池只有两个工作线程,导致资源等待。

Java并发编程系列08:CyclicBarrier+Executors+Runnable结合,实现多线程安全 Java(79):CyclicBarrier+Executors结合,实现多线程安全 阅读详情

相关推荐

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 261

Java并发基础(13):CyclicBarrier

1、CyclicBarrier:一个同步辅助类,用于协调多个子线程,让多个子线程在这个屏障前等待,直到所有子线程都到达了这个屏障时,再一起继续执行后面的动作。 2、使用场景举例: 年末公司组织团建,要求每一位员工周六上午8点【自驾车】到公司门口集合,然后【自驾车】前往目的地。 在这个案例中,公司作为主线程,员工作为子线程。 3、代码示例; package com.test.spring.support; import java.util.concurrent.BrokenBarrierExcept

mingyuli的博客 509

Gromacs实战:从蛋白质-小分子对接到分子动力学模拟全流程解析

本文详细解析了使用Gromacs进行蛋白质-小分子复合物分子动力学模拟的全流程。从处理AutoDock等对接软件的结果文件开始,逐步指导如何为蛋白质和小分子分别生成拓扑文件,并解决力场合并的核心挑战。文章涵盖了构建模拟盒子、添加溶剂离子、能量最小化、平衡模拟以及关键的轨迹分析步骤,为计算生物学和药物设计研究者提供了一套从静态对接到动态评估的完整实战指南。

weixin_29251337的博客 1218

cyclicbarrier java_Java并发编程之CyclicBarrier和线程池的使用

原标题:Java并发编程之CyclicBarrier和线程池的使用下面我们来讲述一下线程池和CyclicBarrier的使用和对比。一、场景描述有四个游戏玩爱好者玩游戏,游戏中有三个关卡,每一个关卡必须让所有玩家到达后才能允许通过。其实这个场景里的玩家中如果有玩家B先到了第一个关卡,他必须要等到其他剩余玩家都到达第一个关卡时才能通过,这也说明了线程之间需要相互等待。这和CountDownLatch...

weixin_29061997的博客 635

LM1875官方电路图元件作用解释说明以及电路调校

R1是为C1提供充放电回路用的电阻,这是老外工作严谨的地方,其实接好电位器之后直流通路就已经存在了,这个加上只能防止最恶劣情况时也能把C1的电能放掉,尽管只有一点点 C1是输入电容,主要作用是隔离前后级的直流信号,但是这个电容对音质的影响很大,可以换用不同的品牌和容量来部分修改音质和音色 R2提供LM1875正输入端的直流电平控制点,接地就表示在理想情况下Lm1875的输出直流电平是0V;还有一个作用就是确定放大器的交流输入阻抗为电阻值。 R3、R4是反馈电阻,这个电路的放大倍数为R4/R3+1=21倍。.

m0_50862404的博客 1万+

OpenClaw 3.13 + Mac mini M4 集成 qmd 记忆存储:qmd embed 卡死 / 报错 sqlite-vec 不可用 终极解决教程

模型加速让 qmd 从国内镜像下载模型,避免网络超时;SQLite 扩展支持:修改 qmd 源码后,Bun 不再使用内置 SQLite,而是调用 Homebrew 安装的,该版本支持接口,可正常加载vec0.dylib向量扩展;OpenClaw 3.13 适配:核心逻辑与 OpenClaw 3.13 的 qmd 记忆调用逻辑完全兼容,无需额外调整;sqlite-vec 加载:qmd 自动通过sqlite-vec包获取vec0.dylib路径,调用完成向量扩展加载,实现高效向量搜索。

wuanxionglidui的博客 1304

CyclicBarrier介绍及使用说明

CycLicBarrier是一个同步辅助类,它控制一组线程互相等待,直到到达设定好的公共屏障点,在涉及一组固定大小的线程池的程序中,这些线程必须不时的互相等待,此时使用CycLicBarrier非常适合,因为barrier在释放等待线程后可以重用,所以被称为循环屏障(cyclcbarrier )。cycLicBarrier类似于CountDownLatch,也可以视作一个计数锁,不同的是,cycli

zxcdert200的专栏 1117

基于 STM32 与压电薄膜的婴儿睡眠呼吸暂停监测床垫设计

本设计以 STM32F103C8T6 为主控,结合 PVDF 压电薄膜传感器,通过模拟信号调理与数字峰值检测算法,实现了对婴儿睡眠呼吸状态的实时监测。系统结构简单、成本低廉、无接触无束缚,当检测到 20 秒以上无呼吸信号时自动触发声光报警,可有效降低婴儿睡眠呼吸暂停带来的安全风险。后续可扩展蓝牙 / WiFi 模块,将报警信息推送至家长手机端,实现远程监护。

weixin_42300449的博客 148

ThreadPoolExecutor和CyclicBarrier配合使用可能带来的隐患

今天是很蛋疼的一天,排查一个bug排查了4个多小时。 情形简化之后大概是这样的: 我使用了spring的ThreadPoolTaskExecutor来进行并发时候的异步处理。并且给任务Runnable加上了CyclicBarrier,以达到让所有线程处理完之后再进行主线程的下一步操作的目的。其中executor的配置如下: [code="java"] ...

iteye_2355的博客 798

YOLO26 改进 | 基于特征蒸馏 | 知识蒸馏 (Response & Feature-based Distillation)

本文系统介绍了YOLO26中的知识蒸馏技术,包含五大核心方法:基于响应的蒸馏(学习分类概率)、基于特征的蒸馏(学习中间层表示)、基于关系的蒸馏(学习特征关联)、通道维度蒸馏(CWD)和前景背景分离蒸馏(FGD)。文章深入解析了每种方法的数学原理与实现细节,并提出动态训练策略,包括一致性匹配和蒸馏权重退火机制。通过教师模型向学生模型传递"暗知识",在保持模型轻量化的同时逼近大模型性能。配套代码支持模块化组合不同蒸馏方法,为YOLO26模型压缩提供了一套完整的解决方案。

weixin_51988935的博客 271

解决MiGPT部署痛点:小米账号异地登录安全验证的解决方案

为让小米音箱更智能🤖,部署MiGPT时遇到小米账号异地登录验证问题,手动验证后仍无法解决。本文分享亲测有效的简化方案✨:通过浏览器F12获取passToken📝,手动创建mi.json配置文件并挂载到Docker容器,无需本地运行MiGPT,直接绕过异地验证,附完整操作步骤和问题排查指南。

XiaoqiangClub的博客 1438

图说 ThreadPoolExecutor 和 Lock 原理

ThreadPoolExecutor :  创建一个 thread pool, pool 中每个 thread 称为 worker,负责执行任务(Task), task个数如果不大于线程池的个数,则分别分给线程池里的各个线程,否则 task 入队列, worker 执行完自己 task,去队列取新任务执行。直到队列里面没有任务,park 住线程池中的线程。   AQS : ...

jackjackqin的专栏 873

uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级详细教程

uniapp中H5微信登录,uniapp H5微信授权登录,微信公众号第三方网页(H5)授权登录(OAuth2.0)流程及逻辑详细教程,UNIAPP 开发H5 怎么实现微信公众号登录功能,uniapp如何实现H5网页的公众号微信登录,怎么做uniapp微信登录,uniapp h5项目怎么实现微信登录的功能,uniapp微信浏览器H5授权微信登录,UniApp开发H5接入微信登录的全过程,uniapp的H5页面使用微信登录,uniapp H5微信授权登录,H5之微信授权登陆 (uniapp网页版微信授权登录)

🏆 前端领域优质创作者 7407

线程池的创建以及CyclicBarrier与CountDownLatch的简单使用

一、线程池的简单创建 (1)、使用Executors进行创建 ExecutorService poo1 = Executors.newFixedThreadPool(10); ExecutorService pool = Executors.newSingleThreadExecutor(); 这两种线程池都是无界队列的线程池,创建比较简单,但可能导...

Anur IjuoKaruKas的博客 1089

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

多线程ThreadPoolExecutor的周边

ThreadPoolExecutor参数详解 首先看下ThreadPoolExecutor的构造方法,一共有四个构造方法,主要阐述最全参数的构造方法。 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。 一、corePoolSize 线程池核心线程大小 线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也

zhouyingxiong的博客 1406

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

java 线程池(Executors、ExecutorService、ScheduledExecutorService)和(Callable、Future、CyclicBarrier)实践篇

一、FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool 简单使用(不推荐) public void fixedThreadPool1(){ int size = 5; ExecutorService threadPool = Executors.newFixedThrea...

eddyjoe的博客 780

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

CyclicBarrier

CyclicBarrier 大厂面试题: 我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案? 公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。 CountDownLatch、CyclicBarrier、Semaphore使用过吗? 阻塞队列知道吗? 线程池用过吗?ThreadPoolExecutor谈谈你的理解? 线程池用过...

泷泷养的乔小胖 540

CyclicBarrier用法

前面介绍了CountDownLatch,可以实现计数。达到指定的数后,就会同时执行。 那么CyclicBarrier跟CountDownLatch实现的功能差不多。 import java.util.Random; import java.util.concurrent.*; /** * await()就好比是屏障,经过指定数量的屏障才可以执行最后的线程。 * 或者说是一直等待,直到aw...

jinjin603的博客 4013

并发工具之CountDownLatch与CyclicBarrier

int threadCount = ((ThreadPoolExecutor)executorService).getActiveCount();if (threadCount == 6) {System.out.println(“裁判员响哨…”);startSignal.countDown();endSignal.await();System.out.println(“所有运动员到达终点,比赛结束!”);}executorService.shutdown();}}输出结果各位运动员准备啦!!!pool-1

2401_84048521的博客 608

深入理解CyclicBarrier

CyclicBarrier基于AQS的Condition来实现。 相比CountDownLatch,CyclicBarrier 可以有不止一个栅栏,因为它的栅栏(Barrier)可以重复使用(Cyclic)。 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。 使用案例 注意下面的CyclicBarrier可以循环使用 @org.junit.jupiter.api.Test

灵药的博客 347

java AQS CyclicBarrier的应用

CyclicBarrier 作为并发中的一个重要的AQS同步器,可以建立线程屏障来管理线程,可以实现某些特定的业务场景,这里举个例子:有一个大小为50000的随机数组,要用5个线程分别计算10000个元素的和,然后将计算结果进行合并,得出最后的结果。这个业务的实现就可以通过CyclicBarrier同步器来实现。具体实现代码如下: package com.gjn.threadpool.servic...

ybb_bzZ的博客 299

java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

1、CountDownLatch:一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。2、ThreadPoolExecutor/ExecutorService:线程池,使用线程池可以复用线程,降低频繁创建线程造成的性能消耗,同时对线程的创建、启动、停止、销毁等操作更简便。3、使用场景举例: 年末公司组织团建,要求每一位员工周六上午8点到公司门口集合,统一乘坐公司所租大巴

javaloveiphone的专栏 1万+

别忘记奔跑-CountDownLatch/CyclicBarrier/Semaphore 阻塞队列 线程池 死锁编码及定位

目录 一、CountDownLatch/CyclicBarrier/Semaphore使用过吗? 1.1CountDownLatch 1.2CyclicBarrier 1.3 Semaphore 二、阻塞队列知道吗? 2.1 队列+阻塞队列 2.2 为什么用?有什么好处? 2.3 BlockingQueue的核心方法 2.4 架构梳理+种类分析 2.4.1 架构介绍 2.4.2 种类分析 2.5 用在哪里 2.5.1 生产者消费者模式 三 线程池用过吗?ThreadPoolE..

youhaitao_do的博客 991

一步步学习多线程(九) CyclicBarrier

CyclicBarrier位于java.util.concurrent包下,可以叫它回环栅栏,我们可以简单的理解为可以无限次重置的计数器。 构造函数: 1、public CyclicBarrier(int parties, Runnable barrierAction) 2、public CyclicBarrier(int parties) 参数 parties (the number o...

money9sun的博客 2113

续接前文CountDownLatch之CyclicBarrier

日常使用当中我们一般用CountDownLatch做减法操作,用CyclicBarrier做加法操作,殊不知其实这两个具有异曲同工之妙,CountDownLatch通过它的countDown()使得任务减一,通过await()来判断其是否任务结束,如果没有结束则阻塞,结束则执行下一步操作。简单来说如果没有顺序要求,那就正如1到7和7到1一样,使用没有什么明显区别,最终的执行结果都是一样的,如下所示CyclicBarrier的简单使用。

rrgef的博客 165
上一篇: Swagger Resolver error at definitions异常解决
下一篇: docker 快速搭建minio 服务
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值