CountDownLatch 和 CyclicBarrier 用法以及区别
在使用多线程执行任务时,通常需要在主线程进行阻塞等待,直到所有线程执行完毕,主线程才能继续向下执行,主要有以下几种可选方式
1. 调用 main 线程的 sleep 方法
一般用于预估线程的执行时间,在主线程内执行线程sleep方法阻塞线程,如下方式:
public class Main {public synchronized static void print(){System.out.println("abc");}public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 100; i++) {new Thread(()->{print();}).start();}Thread.sleep(1000);}
}
这种方式的缺点就是,线程执行的时间与数量和其任务执行的长短有关,一般很难去预估。
2. 使用CountDownLatch
CountDownLatch 提供了一个阻塞阀门,当阀门 count 变成 0 时候放行
- 首先
CountDownLatch会初始化线程数量为实际线程的运行数量 - 每当一个线程执行完毕后,会把
count - 1 - 主线程调用
countDownLatch.await()方法进行阻塞,当count == 0时,则所有线程执行完毕,主线程开始继续向下执行
// 100 个线程打印abc, 等到所有线程执行结束, 主线程开始继续向下执行
public class Main {public synchronized static void print(){System.out.println("abc");}public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();// CountDownLatch缺点: CountDownLatch是一次性的, 使用完毕后不能再对其设置值CountDownLatch countDownLatch = new CountDownLatch(100);for (int i = 0; i < 100; i++) {new Thread(()->{// 执行线程任务print();// 执行完毕 --- 将 countDownLatch - 1countDownLatch.countDown();}).start();}// 主线程因为之前的线程没有执行完阻塞在这里// 当所有线程执行完毕后, 主线程会继续执行countDownLatch.await();System.out.println("线程执行结束:");System.out.println("执行时间为: " + (System.currentTimeMillis() - start) + "ms");}
}
3. 使用 CyclicBarrier
CyclicBarrier 也是一种多线程执行时候的控制器,而对于CyclicBarrier来说,重点是那一组N个线程,他们之间任何一个没有完成,所有的线程都必须等待,当计数器到达指定值时,用法如下:
public class Main {public synchronized static void print(){System.out.println("abc");}public static void main(String[] args) {long start = System.currentTimeMillis();// CyclicBarrier 线程执行控制器 --- 可重用// 当所有线程到达栅栏, 然后触发回调函数CyclicBarrier barrier = new CyclicBarrier(100, ()->{long end = System.currentTimeMillis();System.out.println("线程执行结束:");System.out.println("线程执行所需时间:" + (end - start));});for(int i=0; i<100; i++){new Thread(()->{print();try {barrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}).start();}}
}
4. CountDownLatch 和 CyclicBarrier 区别
| CountDownLanch | CyclicBarrier |
|---|---|
| 减计数方式 | 加计数方式 |
| count为0时释放所有等待的线程 | 计数为指定值时释放所有等待的线程 |
| count为0时可以重置 | 计数置为指定值时,计数为0重新开始 |
| 子线程调用countDown()方法将计数器-1,主线程调用await()方法进行阻塞 | 子线程调用await方法将计数器+1,当加后的值不等于指定值,当前线程阻塞 |
| 不可重复利用 | 可重复利用 |
相关文章:
CountDownLatch 和 CyclicBarrier 用法以及区别
在使用多线程执行任务时,通常需要在主线程进行阻塞等待,直到所有线程执行完毕,主线程才能继续向下执行,主要有以下几种可选方式 1. 调用 main 线程的 sleep 方法 一般用于预估线程的执行时间,在主线程内执行线程sleep…...
9.9喝遍“茶、奶、果、酒”,茶饮价格战是因为“无活可整”?
“家人们谁懂啊,周一瑞幸周二奈雪周三茶百道周四库迪周五古茗周六coco,9块9根本喝不完!” 紧随咖啡的9.9大战,茶饮们也在今年加速“蜜雪冰城化”,9.9变成了一种潮流。伴随着茶百道、coco、奈雪的茶等品牌把9.9玩出了更…...
echarts 学习网址
1、PPChart 网址:PPChart - 让图表更简单 2、YX-Chartlib 网址:http://chartlib.datains.cn3、isqqw 网址:echarts图表集4、makeapie 网址:makeapie echarts社区图表可视化案例5、Chart.Top 网址:chart.top - 让图…...
android源码编译
整包编译 导入环境变量 source ./build/envsetup.shlunch:选择平台编译选项make:执行编译 编译单个apk 进入到apk mk所在路径 mma...
盘点双电机驱动技术
对于电动汽车来说,双电机相对于单电机加主减速器或变速箱的方案在提高驱动效率方面的优势: 第一,单电机在低速、高速轻载等情况下,效率降低比较严重。 电动机的高效区间虽然比内燃机大得多,但是汽车的转速和转矩要求…...
ubuntu下用pycharm专业版连接AI服务器及其docker环境
一:用pycharm专业版连接AI服务器 1、首先在自己电脑上新建一个文件夹,后续用于映射服务器上自己所要用的项目文件 2、用pycharm专业版打开该文件夹,作为一个项目打开 3、然后在工具->部署->配置 4、配置中形式如下: 点击左…...
IntentFilter笔记
一、action <intent-filter>中可以有多个action,Intent只要匹配其中1个action即匹配成功<intent-filter>没有action,任何Intent无法与之匹配<intent-filter>中有action,Intent中没有action时可以与之匹配成功<intent-fi…...
【二叉树】——链式结构(快速掌握递归与刷题技巧)
📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 👍…...
项目管理—项目普遍存在的问题
软件公司有开发业务,在完成一个软件产品或实施项目时,常常会出现以下的状况: 开发人员不懂客户业务,一个高大上的规划,落地后的软件,只是机械的满足了基本功能,毫无易用性和科学性可言。 项目只…...
Ubuntu Seata开机自启动服务
1、创建service文件 在/lib/systemd/system目录下创建seata.service文件 [Unit] Descriptionalibaba seata Afternetwork.target Documentationhttps://seata.io/zh-cn/[Service] Userroot Grouproot Typeforking Environment"JAVA_HOME/usr/local/programs/jdk-8u333-li…...
腾讯mini项目-【指标监控服务重构】2023-08-26
今日已办 Venus 的 Trace 无感化 定义 handler 函数 fiber.Handler 的主要处理逻辑返回处理中出现的 error返回处理中响应 json 的函数 // handler // Description: // Author xzx 2023-08-26 18:00:03 // Param c // Return error // Return func() error : function for …...
《Essential C++》之(面向过程泛型编程)
目录 🌼面向过程的编程风格 -- 第2章 🍈2.2 🍈2.4 🍈2.5 🍈2.6 🌼泛型编程风格 -- 第3章 🍍3.1 🍍3.4 前言 要求 完整代码 输入输出 🌼面向过程的编程风…...
机器学习笔记:adaBoost
1 介绍 AdaBoost(Adaptive Boosting)是一种集成学习方法,它的目标是将多个弱分类器组合成一个强分类器 通过反复修改训练数据的权重,使得之前分类错误的样本在后续的分类器中得到更多的关注每一轮中,都会增加一个新的…...
Anchor DETR
Anchor DETR(AAAI 2022) 改进: 提出了基于anchor的对象查询提出Attention变体-RCDA 在以前DETR中,目标的查询是一组可学习的embedding。然而,每个可学习的embedding都没有明确的意义 (因为是随机初始化的)ÿ…...
适合在家做的副业 整理5个,有电脑就行
今天,我们不说别的,整理5个适合个人在家单干的副业。需要电脑,如果你没电脑就不用看了,最后两个,我们也在做,你可以看到最后了解。这些副业,大家多去实践操作,前期,每月三…...
Android WebSocket
WS Android WebSocket 资源 名字资源AAR下载GitHub查看Gitee查看 Maven 1.build.grade allprojects {repositories {...maven { url https://jitpack.io }} }2./app/build.grade dependencies {implementation com.github.RelinRan:WS:2022.2023.9.23.1 }初始化 配置权…...
Android 按键流程
一、驱动层流程 主要流程涉及以下文件 kernel/msm-4.19/drivers/input/keyboard/gpio_keys.c kernel/msm-4.19/drivers/input/input.c kernel/msm-4.19/drivers/input/evdev.c kernel/msm-4.19/drivers/input/input-compat.c 有按键动作时,根据 dtsi 中配置 c…...
C语言——运算符
C用运算符表示算术运算。 C没有指数运算符,不过,C的标准数学库提供了一个pow()函数用于指数运算。 基本运算符 赋值运算符: 变量名变量值 从右到左 左值和变量名的区别: 变量名是一个标识符的名称,左值是一个可变…...
MySQL数据库入门到精通8--进阶篇( MySQL管理)
7. MySQL管理 7.1 系统数据库 Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下: 7.2 常用工具 7.2.1 mysql 该mysql不是指mysql服务,而是指mysql的客户端工具。 语法 : mysql [options] [database] 选…...
硬件基本功--MOS管
一、上下拉电阻Rgs的作用 Rgs:经验值,一般取10K左右。 1. 上电时给MOS管的栅极一个确定的电平,防止上电时GPIO为高阻态时,MOS管的栅极电平不确定,从而受到干扰。 2. 断电时,如果MOS管是导通的状态ÿ…...
200块搞定AI视觉项目:手把手教你用Canmv K210训练识别模型(附完整代码)
200元打造AI视觉神器:Canmv K210从模型训练到落地实战指南 在AI技术快速普及的今天,动辄数千元的开发套件让许多创客和学生望而却步。Canmv K210开发板的出现彻底改变了这一局面——仅需200元预算,就能搭建完整的AI视觉识别系统。本文将带你从…...
中小企业如何通过Taotoken的Token Plan套餐控制AI集成成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 中小企业如何通过Taotoken的Token Plan套餐控制AI集成成本 应用场景类,中小企业在为官网或CRM系统集成AI功能时&#x…...
拆解进销存流程的5大核心功能,手把手教你规范企业的进销存流程
在现代企业的数字化管理中,规范进销存流程是提升运营效率、降低管理成本的关键所在。一个科学、严谨的进销存流程不仅能帮助企业实现采购、销售与库存数据的实时同步,还能有效解决账实不符、库存积压等长期痛点。本文将深入拆解进销存流程中的5大核心功能…...
NotebookLM协作效能临界点预警:当团队超8人时,必须立即启用的3项动态共享策略
更多请点击: https://intelliparadigm.com 第一章:NotebookLM协作效能临界点的本质洞察 NotebookLM 的协作效能并非随用户数量线性增长,而是在特定交互密度与知识对齐度交汇时触发跃迁式提升——这一拐点即为“协作效能临界点”。其本质并非…...
终极AI分层工具:3分钟让单张图片变专业PSD文件
终极AI分层工具:3分钟让单张图片变专业PSD文件 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的插画分层工作头疼吗?L…...
AI 术语通俗词典:人工神经元
人工神经元是深度学习、神经网络和人工智能中非常基础的一个术语。它用来描述神经网络中最基本的数学计算单元。换句话说,人工神经元是在回答:模型怎样把多个输入信号加权合并,并转换成一个新的输出信号。如果说神经网络是一套由许多层组成的…...
中小团队如何利用Taotoken统一管理多个AI模型的API调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 中小团队如何利用Taotoken统一管理多个AI模型的API调用 对于需要协调使用多个大模型的中小开发团队而言,一个常见的工程…...
打破平台壁垒:Windows上安装APK文件的完整解决方案
打破平台壁垒:Windows上安装APK文件的完整解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行安卓应用ÿ…...
第07章 FastMCP 把检索封装成 Agent 工具
第07章 FastMCP 把检索封装成 Agent 工具 工单知识库已经能在 Python 进程内被普通函数调用,但要让外部 Agent、Web 后端或其他语言的客户端使用这份能力,函数级别的接口不够:缺少协议、缺少描述、缺少跨进程通讯。MCP(Model Cont…...
Altium Designer实战:用xSignals搞定DDR4内存的等长布线,告别时序烦恼
Altium Designer实战:用xSignals实现DDR4内存精准等长布线 在高速PCB设计中,DDR4内存接口的布线一直是硬件工程师面临的技术高地。当信号速率突破2400MHz时,地址、命令与数据线之间哪怕几个ps的时序偏差都可能导致系统不稳定。传统手工计算网…...
