CountDownLatch--一组线程完成后其他线程才执行(一)

如何判断线程池中线程任务已经全部执行完毕之 CountDownLatch 前言: 最近在工作中遇到了与线程相关的问题,对于线程运用不太熟练的我,最近可是在线程的知识海洋里奋力挣扎,最后发现哥伦布又探索出一块新大陆。知识无穷无尽,每天进步一点点,每天吸收一点点,让自己知道:我在进步。 问题由来: 最近在做数据压缩的功能,需要压缩将近3个月的数据,通过线程池创建线程的方式进行压缩,但是我想在所有的线程任务执行完毕之后再给前端返回,压缩任务已完成,在这之前我做过很多控... 阅读详情

问题背景:

问题一:

java多线程,A、B、C、D统计4个盘大小,统计完后第5个人汇总。

问题二:

比如一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有团队成员跑完,方可计算总成绩。


java.util.concurrent.CountDownLatch

你可以向 CountDownLatch 对象设置一个初始计数值,任何在这个对象上调用  await()  的方法都将阻塞,直到这个计数值为0。其他任务在结束其工作时,可以在该对象上调用 countDown() 来减小这个数值,这个方法不会阻塞线程。 CountDownLatch 被设计为只触发一次,计数值不能被重置。如果你需要能够重置计数值的版本,则可以使用 CyclicBarrier .

 CountDownLatch  的典型用法时将一个程序分成n个互相独立的可解决任务,并创建值为n的CountDownLatch。每当任务完成时,都会在这个锁存储器上调用countDown()方法。等待问题被解决的任务在这个锁存储器上调用await()。将它们自己拦住,直到存储器计数结束。

示例1:通用代码示例

import java.util.concurrent.CountDownLatch;

/**
 * 比如一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有
 * 团队成员跑完,方可计算总成绩。
 * 
 * 题目2:统计4个盘子的大小,统计完后交给第五个人汇总
 */
public class CountDownLatchTest {
	public static void main(String[] args) throws InterruptedException {
		CountDownLatch startSignal = new CountDownLatch(1);
		CountDownLatch doneSignal = new CountDownLatch(4);
		
		
		//四个人赛跑,这4个可以写一个for循环
		new Thread(new Worker(startSignal, doneSignal)).start();
		new Thread(new Worker(startSignal, doneSignal)).start();
		new Thread(new Worker(startSignal, doneSignal)).start();
		new Thread(new Worker(startSignal, doneSignal)).start();

		System.out.println("这里放计数前自己的代码...");//由于startSignal是1,上边的4个线程还不能执行
		startSignal.countDown(); // startSignal=0,线程可以开始执行了
		
		//doSomethingElse();
		System.out.println("计数后的代码...这是主线程...和上边4个线程混在一起的...");
		doneSignal.await(); // 判断上边4个是否执行完了,如果是,则允许下边的代码执行
		//开始执行另外一个任务
		System.out.println("开始执行其他任务...");
	}
}
class Worker implements Runnable {
	private final CountDownLatch startSignal;
	private final CountDownLatch doneSignal;

	Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
		this.startSignal = startSignal;
		this.doneSignal = doneSignal;
	}

	@Override
	public void run() {
		try {
			startSignal.await();  //startSignal的计数到0了吗?到0了,才能执行
			doWork();
			doneSignal.countDown();
		} catch (InterruptedException ex) {
		} 
	}

	void doWork() {
		System.out.println("正在统计中...");
	}
}
//结果
这里放计数前自己的代码...
计数后的代码...这是主线程...和上边4个线程混在一起的...
正在统计中...
正在统计中...
正在统计中...
正在统计中...
开始执行其他任务...





多线程之CountDownLatch和CyclicBarrier的区别和用法 一.CountDownLatch的使用 CountDownLatch经常用于监听某些初始化操作,等初始化执行完毕后,再通知主线程继续工作。 CountDownLatch定义: 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await ... 阅读详情

相关推荐

保姆级教程:2025新版JavPlayer 3.01整合修复版安装配置全流程(N卡/A卡/CPU通用)

本文提供2025新版JavPlayer 3.01整合修复版的保姆级安装配置教程,涵盖N卡、A卡和CPU环境。详细讲解硬件要求、分步安装流程、显卡优化配置及超分辨率模型选择,帮助用户高效完成视频修复任务。

weixin_42665255的博客 1872

CountDownLatch介绍和使用【Java多线程必备】

CountDownLatch介绍、特性、注意事项、使用案例(干货满满)

Mr.绵羊的知识星球 3万+

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

Java并发工具CountDownLatch使用详解

通过使用 CountDownLatch可以使当前线程阻塞,等待其他线程完成给定任务。可以类比旅游团导游要等待所有的游客到齐后才能去下一个景点。 CountDownLatch主要应用场景:一个线程等待多个线程完成给定任务后,然后执行后续的操作的场景。

warybee 1万+

Android真机调试——ADB调试(含华为手机无法找到设备)

本文以Huawei Nova7为例。

lianqi2003的博客 7854

Vienna整流器SVPWM调制:7扇区划分与中点电位平衡的MATLAB/Simulink实现解析

本文深入解析Vienna整流器的SVPWM调制技术,重点介绍7扇区划分与中点电位平衡的MATLAB/Simulink实现方法。通过详细的算法推导和仿真模型构建,帮助工程师掌握整流器闭环控制策略,优化功率转换效率。内容涵盖扇区判断逻辑、矢量作用时间计算及中点电位平衡的PID调节等核心技术要点。

weixin_33937499的博客 386

Java并发 - CountDownLatch详解

`CountDownLatch` 是 Java 中的一个同步工具类,它允许一个或多个线程等待其他线程完成操作。`CountDownLatch` 的主要思想是,一个线程等待其他线程完成一组操作,它在倒计时计数器的基础上工作,计数器的初始值是一个正整数,每当一个线程完成一项操作,计数器的值减一。当计数器的值变为零时,等待的线程被释放,可以继续执行。

--土拨鼠-- 2554

代谢组数据分析(二十四):基于tidymass包从质谱原始数据到代谢物注释结果的实践指南

本教程介绍了如何使用 R 语言中的 tidymass 包进行代谢组学数据分析。tidymass 是一个专为液相色谱-质谱(LC-MS)数据设计的开源工具,提供从数据准备到统计分析的全流程支持。教程详细讲解了数据准备、数据处理、数据探索、数据清洗、代谢物注释、统计分析及结果输出的步骤。用户需准备 MS1、MS2 数据和样本信息表,并通过 tidymass 进行峰识别、峰分组、保留时间校正等操作。数据处理后,用户可进行数据探索、清洗和代谢物注释,最终通过统计分析发现潜在的生物标志物,并输出结果。教程还提供了代码

专注生信领域 1634

Java并发编程之CountDownLatch

一、概述 作用:可以用来确保某些活动直到其他活动都完成后才继续执行。它一个同步工具,一般被称作"计数器",作用大致就是数量达到了某个点之后计数结束,才能继续往下走。可以用作流程控制之类的作用,主流程分成多个子流程,然后主流程在子流程全部结束之前不动(子流程最好是相互独立的,除非能很好的控制两个流程的关联关系),子流程全部结束后主流程开始操作。应用场景:CountDownLatch非常适合于对任务进行拆分,使其并行执行,比如某个任务执行2s,其对数据的请求可以分为五个部分,那么就可以将这个任务拆分为5个子任

Flychuer的专栏 4215

上机任务一:空气质量指数 (air quality index,AQI是定量描述空气质量状况的指数。为了更好地了解和人们身体健康息息相关的天气状况,本书模拟生成500条某地区天气数据,一行样本对应一天

调整后的R平方为0.4308,考虑了模型中的自由度,它略低于多重R平方,说明模型的解释能力可能有限。总的来说,新的模型相对于之前的模型在AIC值上更优,包含了最高温度(X2)和最低温度(X3)这两个重要的预测因子,并且对AQI的解释能力较好。在表中,Df表示自由度,Sum Sq表示总平方和,Mean Sq表示均方(总平方和除以自由度),F value表示F统计量,Pr(>F)表示对应的p值。在分析这些结果时,需要关注系数的显著性(p值),系数的方向(正向或负向影响),以及系数的大小(估计值)。

Mrrunsen的博客 722

基于Simulink的电机热阻模型建立与仿真

本文详细介绍了基于Simulink的电机热阻模型建立方法。通过将电机传热路径分解为5段关键热阻(绕组内部、槽绝缘、铁芯、机壳、冷却系统),采用Simscape Thermal模块构建热阻网络模型。重点阐述了参数化热阻计算、实验数据校准、不同设计方案对比等关键步骤,并以15kW车用PMSM为例演示建模过程。文章还分享了非线性热阻处理、多维网络构建等高级技巧,指出该模型在热设计迭代、散热匹配、故障诊断等方面的重要工程价值,为电机热安全设计提供了有效的数字化解决方案。

xiaoheshang_123的博客 335

Java并发——CountDownLatch

`CountDownLatch`是Java并发中常用的一个工具类,通常称为锁存器latch,作用为同步一个或多个任务,强制等待指定任务执行完成,即多线程中控制一个或多个线程去等待其他线程完成操作。本文将详解介绍CountDownLatch的使用及底层原理。

雪月清的博客 1947

第一章 电力电子仿真软件 PLECS简介

PLECS是瑞士Plexim公司开发的电力电子仿真软件,具有快速仿真、丰富元件库和热分析功能。软件提供单机版和嵌入MATLAB的版本,支持多平台安装且流程简单。首次运行需获取授权文件,提供60分钟演示模式。界面包含模型创建、帮助文档和元件库浏览器等功能区域,操作便捷。该软件是专业高效的电力电子系统仿真工具。

493

CountDownLatch和CyclicBarrier

CountDownLatch和CyclicBarrier

大军的博客 143

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java CountDownLatch应用

Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。 你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。 CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执...

yelu2016的博客 118

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java并发-CountDownLatch

概述 一种同步帮助,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。 示例 // 旅游巴士要等到每一个都准备好了才出发. public class CountDownLatchDemo { //代表游客准备任务 static class Traveler implements Runnable { private CountDownLatch re...

a1158375969的专栏 204

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java并发编程(三)-CountDownLatch和CyclicBarrier

CountDownLatch CountDownLatch类利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 CountDownLatch类只提供了一个构造器: //参数count为计数值 public CountDownLatch(int count) { }; 然后下...

林元煌 7006

java线程调用主线程吗_java多线程执行时主线程的等待

1、通过thread.join()方式,注意:如果有多个子线程,需要将全部的线程先start,然后再join。代码示例如下:public class Main{public static void main(String[] args){long start = System.currentTimeMillis();List list = new ArrayList();for(int i = 0...

weixin_42509236的博客 329

关于CountDownLatch的一点理解

说白了:就是一个计数器 他的三大用处: 1构造函数 2.countDown() 3.await() awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0 countDown方法,当前线程调用此方法,则计数减一 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每...

天道酬勤 313

CountDownLatch控制多个线程的执行

需求:多个线程同时工作,然后其中几个线程可以随意并发,但是有一个线程要等待之前几个线程并发执行的结果,才能开始执行, 举例:开启多个线程下载一个文件,每个线程固定下载一段,最后由一个线程来拼接之前的线程下载的结果,那么这个时候我们就可以使用CountDownLatch来实现以上的需求。CountDownLatch 是Concurrent包中的一个辅助类,可以把他看成是一个计数器,其内部维护着一个c...

qiuhao9527的博客 2826

多线程编程中如何确保子线程执行完毕后主线程再执行-CountDownLatch

定义 ountDownLatch是在java1.5被引入,存在于java.util.cucurrent包下,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行,它是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。 线

梦里蓝天 4049

Java多线程三(线程池执行完后再执行主线程)CountDownLatch

我们在开发多线程的时候,有两种情况 一种是我们处理好后,不用管结果。比如我需要查询某些数据然后存在数据库里。还有一种就是查询好数据(通过线程池),然后导出数据。这个就比较麻烦。因为我们要将数据通过多线程处理后,返回一个统一的结果。(由于多线程是在不同的时候执行数据),假如执行线程池后,在执行主线程,这就涉及到线程优先级。所以会比较蛮烦。 import java.util.*; import java.util.concurrent.CountDownLatch; public class Te...

wszhm123的博客 5993

CountDownLatch 等待多个线程完成再继续执行某个操作

CountDownLatch 是 Java 并发包 (java.util.concurrent) 中的一个同步辅助类,它可以用来控制一个或多个线程等待直到一组操作完成。下面是你提供的代码的详细解释和用法:代码解析初始化 CountDownLatch:这里创建了一个 CountDownLatch 实例,初始计数值为 equipments.size(),也就是设备的数量。这个值表示需要等待的事件数量。等待操作:try {

刘大猫 971

线程等待其他线程执行同步类CountDownLatch

本文我们讲述了CountDownLatch 是通过AQS抽象阻塞队列实现同步功能的,又说到了awat()方法本质是调用AQS加入阻塞队列的方法,countDown本质是调用AQS释放共享锁的方法。对于最很重要的唤醒阻塞线程逻辑,也是通过CountDownLatch 覆写tryReleaseShared()方法达到满足释放共享锁条件的,在AQS释放共享锁中如果阻塞队列存在阻塞线程会唤醒线程。

勤于笔记,成于点滴。 1346

java中等待所有线程都执行结束的方法(CountDownLatch与 CyclicBarrier)

1.使用 CountDownLatch ,每个线程完成后都去将计数器减一,最后完成时再来唤醒主线程. 代码示例: public class testThreadSync3{ public static void main(String[] args) { final Vector<Integer> list = new Vector<Integer>(); Thread[] threads = new Thread[10]; f

知北行的博客 1552

JUC(一)CountDownlatch:如何让一些线程等待另外一些线程执行完再执行

一、案例分析: 1.假如我们现在有一个需求: (1)全班10个同学出游,司机要等待这10个同学都上车之后才出发 (2)假如我们要通过50个线程,打印5000以内的偶数,最后计算总共消耗的时间(代码实现附在文末) (3)线程a计算公司支出,线程b计算公司盈利,线程c等待ab执行完成后计算公司利润。 2.需求实现: 我们实现需求1吧,其他自行实现,欢迎尝试。 按照正常写法会是这样的: public class juctest { /** * author:liganggang

weixin_43082657的博客 604
上一篇: http、tcp/ip流程
下一篇: CountDownLatch--一组线程完成后其他线程才执行(二)
王小禾
博客等级 码龄11年 80粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值