线程池和CountDownLatch搭配使用

一,CountDownLatch

CountDownLatch是Java并发编程中用于线程间协调的一个同步辅助类。它通过一个初始计数值来控制线程的等待,这个计数值在其他线程执行特定任务时递减。

  1. 初始化:创建CountDownLatch实例时,你需要指定一个整数值,该值代表需要等待的事件或任务的数量。

  2. 递减计数countDown()方法用于减少CountDownLatch的当前计数值。每当一个关联的操作执行完毕,就调用此方法,从而向等待的线程发出信号。

  3. 等待完成await()方法用于阻塞当前线程,直到CountDownLatch的计数值达到0。这意味着主线程或其他等待的线程会在执行了await()调用的地方暂停,直到所有相关的countDown()操作完成。

  4. 灵活性countDown()可以被同一个线程多次调用,每次调用都会导致计数值减少。同时,如果有多个线程都在等待,它们会共享同一个CountDownLatch的计数值,当计数值减到0时,所有等待的线程都会被唤醒。

  5. 超时机制await()方法还可以接受一个超时时间参数,这样即使计数值没有在规定时间内减到0,等待的线程也会被唤醒,避免无限期等待。

  6. 结果汇总:在所有任务执行完毕后,主线程可以安全地继续执行,此时可以对子线程中的任务结果进行汇总或后续处理。

通过这种方式,CountDownLatch确保了在所有预定的任务或事件完成之前,主线程或其他线程不会过早地继续执行,从而实现了线程间的协调和同步。

二,示例

public class 多线程结合countdownlatch {public static void main(String[] args) {//模拟任务List<String> records = new ArrayList<>();records.add("rc1");records.add("rc2");//线程池System.out.println("开始执行");ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());CountDownLatch latch = new CountDownLatch(records.size());records.forEach(record->{service.execute(new Runnable() {@Overridepublic void run() {try {System.out.println(record);Thread.sleep(2000);//执行业务逻辑} catch (InterruptedException e) {throw new RuntimeException(e);}finally {latch.countDown();}}});});try {latch.await(30, TimeUnit.MINUTES);//设置超时时间 防止无限期等待} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("执行完成");}
}

三,使用场景

场景一:CountDownLatch 非常适合于对任务进行拆分,使其并行执行,比如某个任务执行2s,其对数据的请求可以分为五个部分,那么就可以将这个任务拆分为5个子任务,分别交由五个线程执行,执行完成之后再由主线程进行汇总,此时,总的执行时间将决定于执行最慢的任务,平均来看,还是大大减少了总的执行时间。
场景二:使用 CountDownLatch 的地方是使用某些外部链接请求数据的时候,比如图片。在本人所从事的项目中就有类似的情况,因为我们使用的图片服务只提供了获取单个图片的功能,而每次获取图片的时间不等,一般都需要1.5s~2s。当我们需要批量获取图片的时候,比如列表页需要展示一系列的图片,如果使用单个线程顺序获取,那么等待时间将会极长,此时我们就可以使用CountDownLatch对获取图片的操作进行拆分,并行的获取图片,这样也就缩短了总的获取时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/6969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-cli+vue3+vite+ts 搭建uniapp项目全过程(一)

unapp官方提供了cli 脚手架创建 uni-app 项目的文档 Vue3/Vite版要求 node 版本 18、20使用Vue3/Vite版创建不会提示选择模板&#xff0c;目前只支持创建默认模板 本文以vue3vitets为例 1、初始化项目 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 执行完生成…

037——加入Kconfig机制

目录 一、什么是Kconfig 1.1 由来 1.2 功能 二、 Kconfig的基本语法 2.1 Kconfig 构建项目解析 2.2 怎么调用子makefile做menuconfig 方法一&#xff1a;使用make命令直接调用子目录 方法二&#xff1a;使用变量来指定子目录 方法三&#xff1a;使用include指令包含子…

在RStudio上用Git功能管理Github上的项目

在本教程中&#xff0c;你将学习以下内容&#xff1a; 1. 创建一个新的仓库。 2. 使用 Git 和 RStudio 在本地机器上使用你的仓库。 3. 使用 GitHub.com 网站或 GitHub Enterprise 完成 GitHub 工作流程。 4. 使用 GitHub Pages 发布和共享你的 R Markdown 文档。 先决条件&a…

Java openrasp记录-02

主要分析以下四个部分&#xff1a; 1.openrasp agent 这里主要进行插桩的定义&#xff0c;其pom.xml中定义了能够当类重新load时重定义以及重新转换 这里定义了两种插桩方式对应之前安装时的独立web的jar的attach或者修改启动脚本添加rasp的jar的方式 其中init操作则需要将ras…

大数据技术主要学什么,有哪些课程

大数据技术是指在海量数据的环境下&#xff0c;采集、存储、处理、分析和管理数据的一系列技术与方法。随着互联网、物联网以及各种智能设备的普及&#xff0c;数据量呈爆炸性增长&#xff0c;传统数据处理手段已难以应对&#xff0c;因此大数据技术应运而生&#xff0c;旨在从…

加州大学欧文分校英语中级语法专项课程04:Intermediate Grammar Project学习笔记(完结)

Intermediate Grammar Project Course Certificate Specialization Certificate Specialization Intro Course Intro 本文是学习 Coursera: Intermediate Grammar Project 这门课的学习笔记。 文章目录 Intermediate Grammar ProjectWeek 01: IntroductionCapstone Introducti…

论文笔记:DeepMove: Predicting Human Mobility with Attentional Recurrent Networks

WWW 2018 1 Intro 根据对百万级用户群的研究&#xff0c;93%的人类移动是可预测的。 早期的mobility预测方法大多基于模式的。 首先从轨迹中发现预定义的移动模式(顺序模式、周期模式)然后基于这些提取的模式预测未来位置。最近的发展转向基于模型的方法进行流动性预测。 利用…

力扣:62. 不同路径

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

16、Flink 的广播状态 (Broadcast State) 示例

1、Broadcast State 案例 规则流&#xff1a;1,a,b [规则名1 规则为 a 或 b] 图形流&#xff1a;green,a [绿色 a] 问题&#xff1a;如果规则流先于数据流则匹配不上>此时缓冲数据流中的数据【如果规则流为null】 import org.apache.flink.api.common.functions.MapFunct…

redis-内存回收机制

在 Redis 的源码中&#xff0c;redisDb 结构体用于表示一个 Redis 数据库实例。结构体大致如下 typedef struct redisDb {dict *dict; // 存储键值对的字典dict *expires; // 存储键的过期时间的字典dict *blocking_keys; // 阻塞键的字典…

子比主题小黑屋列表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文…

五一假期后,必读的10篇大模型论文

1.同时预测多个 token&#xff1a;更好更快的大型语言模型 目前&#xff0c;GPT 和 Llama 等大型语言模型&#xff08;LLMs&#xff09;都是通过下一个 token 预测损失来训练的。 在这项工作中&#xff0c;来自 Meta FAIR 的研究团队认为&#xff0c;训练语言模型同时预测多个…

用 Go map 要注意这个细节,避免依赖他!

有的小伙伴没留意过 Go map 输出、遍历顺序&#xff0c;以为它是稳定的有序的&#xff0c;会在业务程序中直接依赖这个结果集顺序&#xff0c;结果栽了个大跟头&#xff0c;吃了线上 BUG。 有的小伙伴知道是无序的&#xff0c;但却不知道为什么,有的却理解错误&#xff1f; 今…

PADS 规则设置-导线不跟随器件-导线允许回路

1、PADS Layout中设置拖动器件时导线不跟着移动 2、PADS Router中设置走线允许回路

【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙

【简介】几乎所有的人都知道&#xff0c;防火墙自带的硬盘是用来保存日志&#xff0c;以方便在出现问题时能找到原因。但是很少的人知道&#xff0c;防火墙自带的硬盘其实还有另一个功能&#xff0c;那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…

【备战软考(嵌入式系统设计师)】04-嵌入式软件架构

嵌入式操作系统 嵌入式系统有以下特点&#xff1a; 要求编码体积小&#xff0c;能够在有限的存储空间内运行。 面向应用&#xff0c;可以进行裁剪和移植。 用于特定领域&#xff0c;可以支持多任务。 可靠性高&#xff0c;及时响应&#xff0c;无需人工干预独立运行。 实…

软件全套资料整理包获取-软件各阶段支撑文档

软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求说明书&#xff0c;概要设计说明书&#xff0c…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似…

大模型时序预测初步调研20240506

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

MySQL —— 表的基本操作

一、创建 1.语法 create table 表名称( 自定义变量1, 自定义变量2, 自定义变量3&#xff08;最后一个变量末尾不需要加任何标点符号&#xff09; )charset字符集 collate校验集 engine存储引擎; ps&#xff1a;若是不具体给字符集、校验集、储存引擎&#xff0c;则采用配置文件…