并发技术_3_CountDownLatch

并发编程之CountDownLatch原理与应用 CountDownLatch是一个同步计数器,他允许一个或者多个线程在另外一组线程执行完成之前一直等待,基于AQS共享模式实现的。 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作来。 阅读详情

CountDownLatch

 

Latch门栓,也就是有"门锁"的功能;

当门没有打开时,N个人是不能进入屋内的,也就是N个线程是不能继续往下运行的,支持这样的特性可以控制线程执行任务的时机,使线程以"组团"的方式一起执行任务。

 

CountDownLatch所提供的功能是判断count计数不为0时,则当前线程呈wait状态,也就是在屏障处等待。

CountDownLatch也是一个同步功能的辅助类,使用效果是给定一个计数,当使用这个CountDownLatch类的线程计数不为0时,则呈wait状态,如果为0时则继续运行。

 

实现等待与继续运行的效果分别需要使用await()和countDown()方法来进行。

调用await()方法时判断计数是否为0,如果不为0则呈等待状态。

其他线程可以调用countDown()方法将计数减1,当计数减到0时,呈等待的线程继续运行。

而方法getCount()就是获得当前的计数个数。

 

CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。

(例如:应用程序的主线程希望在 负责启动框架服务的线程已经启动所有的框架服务之后 再执行)

 

CountDownLatch的作用与Thread.join()方法类似,可用于一组线程和另外一组线程的协作。

 

await():调用此方法会一直阻塞当前线程,直到计时器为0。

countDown():当线程调用此方法,计数减一。

 

场景:

运动会赛跑,裁判员要等所有的运动员到达起跑线才开始准备。

初始化CountDownLatch,同时设置计数器的数量(阀值),一个运动员到达,计数器减1,当计数器为0,说明所有运动员到场,

于是看是运行后面的内容

 

 

 

 

初步使用

这个Demo实现 当CountDownLatch的计数不为0时,线程呈阻塞状态。

public class MyService {

	private CountDownLatch down = new CountDownLatch(1);

	public void testMethod() {

	try {

	System.out.println("A");
	down.await();
	System.out.println("B");

	} catch (Exception e) {
			e.printStackTrace();
	}

	}

	public void downMethod() {
			System.out.println("X");
			down.countDown();
	}

}

public class MyThread extends Thread {

	private MyService service;

	public MyThread(MyService service) {
			this.service = service;
	}

	@Override
	public void run() {
			service.testMethod();
	}

}

public class Run {

	public static void main(String[] args) throws Exception {

	MyService service = new MyService();

	MyThread t = new MyThread(service);
	t.start();

	Thread.sleep(2000);
	service.downMethod();

	}

}

输出结果:
	A
	X
	B
	

我们来分析下代码:

  1. main方法启动,执行Thread线程,线程运行MyService类中的testMethod()方法,输出"A"。
  2. 执行到down.await();时,线程阻塞,开始等count计数减少为0。
  3. 上面执行的同时,main方法接着往下走,睡眠了两秒,然后调用MyService类的downMethod()方法
  4. 输出"X"
  5. 这时候,执行down.countDown(),CountDownLatch的计数器减1,于是CountDownLatch计数器变为0。
  6. 于是,阻塞在testMethod()方法中的Thread线程 输出"B"

 

 

 

 

第二个例子

模拟一个栗子:

裁判员要等到所有运动员全部都集中后,才继续往下运行。

论证多个线程 与 同步点之间 阻塞的特点,线程必须都到达同步点之后才可以继续向下运行。

public class MyThread extends Thread {

	private CountDownLatch maxRunner;

	public MyThread(CountDownLatch maxRunner) {
			this.maxRunner = maxRunner;
	}

	@Override
	public void run() {

	try {

	System.out.println(Thread.currentThread().getName());

	Thread.sleep(2000);
	maxRunner.countDown();

	} catch (Exception e) {
			e.printStackTrace();
	}

	}

}

public class Run {

	public static void main(String[] args) throws Exception {

	CountDownLatch maxRuner = new CountDownLatch(10);
	MyThread[] tArr = new MyThread[Integer.parseInt("" + maxRuner.getCount())];

	for (int i = 0; i < tArr.length; i++) {
			tArr[i] = new MyThread(maxRuner);
			tArr[i].setName("线程" + (i + 1));
			tArr[i].start();
	}
	maxRuner.await();
	System.out.println("都回来了");

	}

}

输出结果:
	线程1
	线程2
	线程3
	线程4
	线程6
	线程5
	线程8
	线程7
	线程9
	线程10
	都回来了
	

让我们来捋一下代码:

  1. 我们将计数器设为10,然后创建10个线程。
  2. 迭代线程,每个线程同时执行,在线程中我们将计数器减1,并且睡两秒
  3. 主线程要等计数器为0的时候,才能继续往下走
  4. 最后10个线程,全部循环完成,计数器归零,然后输出"都回来了"

 

 

 

 

第三个栗子

场景:裁判员要等待所有运动员各就各位以后,再开始比赛

public class MyService {

	private CountDownLatch down = new CountDownLatch(1);

	public void testMethod() {

	try {

	System.out.println(Thread.currentThread().getName() + " 准备");
	down.await();
	System.out.println(Thread.currentThread().getName() + " 结束");

	} catch (Exception e) {
			e.printStackTrace();
	}

	}

	public void downMethod() {
			System.out.println("开始");
			down.countDown();
	}

}

public class MyThread extends Thread {

	private MyService service;

	public MyThread(MyService service) {
			this.service = service;
	}

	@Override
	public void run() {
			service.testMethod();
	}

}

public class Run {

	public static void main(String[] args) throws Exception {

	MyService service = new MyService();

	MyThread[] tArr = new MyThread[10];
	for (int i = 0; i < 10; i++) {
			tArr[i] = new MyThread(service);
			tArr[i].setName("线程 " + (i + 1));
			tArr[i].start();
	}

	Thread.sleep(2000);
	service.downMethod();

	}

}

输出结果:
	线程 1 准备
	线程 3 准备
	线程 4 准备
	线程 5 准备
	线程 2 准备
	线程 7 准备
	线程 8 准备
	线程 6 准备
	线程 9 准备
	线程 10 准备
	开始
	线程 1 结束
	线程 3 结束
	线程 4 结束
	线程 5 结束
	线程 2 结束
	线程 7 结束
	线程 8 结束
	线程 6 结束
	线程 10 结束
	线程 9 结束
	

捋一下程序:

  1. Run类中创建一个MyService对象,这时候,计数器中数量为1
  2. 然后创建10个线程,同时启动这10个线程。
  3. 每个线程执行输出"准备"后,因为await()方法,开始阻塞。
  4. 10个线程,全部进入阻塞状态。
  5. 主线程继续往下走,睡两秒,然后执行downMethod()方法。
  6. 这时候,计数器减一。
  7. 接下来所有阻塞的线程,输出"结束"

 

 

这个Demo有个问题,虽然运行成功,但不能保证在main主线程执行了service.downMethod()时,所有的工作线程都呈wait状态,因为某些线程有可能准备的时间较长,可能耗时超过两秒,这时,如果在第两秒调用service.downMethod()方法,就达不到"唤醒所有线程"

继续往下运行的目的了,也就是说,裁判员没有等全部的运动员到来时,就让发令枪响起来开始比赛了。

 

下面我们将这个Demo修改一下。

 

 

 

 

第四个栗子

我们使用CountDownLatch类来实现"所有线程"呈wait后再同一唤醒的效果,此Demo大量使用CountDownLatch类来实现业务要求的同步效果。

public class MyThread extends Thread {

	// 裁判等待所有运动员到来
	private CountDownLatch comingTag;
	// 等待裁判说准备开始
	private CountDownLatch waitTag;
	// 等待起泡
	private CountDownLatch waitRunTag;
	// 起跑
	private CountDownLatch beginTag;
	// 所有运动员到达终点
	private CountDownLatch endTag;

	public MyThread(CountDownLatch comingTag, CountDownLatch waitTag, CountDownLatch waitRunTag, CountDownLatch beginTag, CountDownLatch endTag) {
			this.comingTag = comingTag;
			this.waitTag = waitTag;
			this.waitRunTag = waitRunTag;
			this.beginTag = beginTag;
			this.endTag = endTag;
	}

	@Override
	public void run() {
			try {

	System.out.println("运动员使用不同交通工具不同速度到达起跑重点,正在向这边走");
	Thread.sleep((int) Math.random() * 10000);
	System.out.println(Thread.currentThread().getName() + " 到达起跑点...");

	comingTag.countDown();

	System.out.println("等待裁判说准备..");

	waitTag.await();

	System.out.println("各就各位,准备起跑..");

	Thread.sleep((int) Math.random() * 10000);

	waitRunTag.countDown();
	beginTag.await();

	System.out.println(Thread.currentThread().getName() + "运动员起跑,并且比赛过程用时不确定..");

	Thread.sleep((int) Math.random() * 10000);
	endTag.countDown();

	System.out.println(Thread.currentThread().getName() + "运动员到达终点");

	} catch (Exception e) {
			e.printStackTrace();
	}
	}

}

public class Run {

	public static void main(String[] args) {

	try {

	CountDownLatch comingTag = new CountDownLatch(10);
	CountDownLatch waitTag = new CountDownLatch(1);
	CountDownLatch waitRunTag = new CountDownLatch(10);
	CountDownLatch beginTag = new CountDownLatch(1);
	CountDownLatch endTag = new CountDownLatch(10);

	MyThread[] tArr = new MyThread[10];
	for (int i = 0; i < 10; i++) {
			tArr[i] = new MyThread(comingTag, waitTag, waitRunTag, beginTag, endTag);
			tArr[i].start();
	}

	System.out.println("裁判员在等待选手到来");
	comingTag.await();

	System.out.println("裁判员看到所有运动员来了,各就各位前巡视,用时5秒");
	Thread.sleep(5000);
	waitTag.countDown();

	System.out.println("各就各位...");
	waitRunTag.await();
	Thread.sleep(2000);

	System.out.println("发令枪响");
	beginTag.countDown();
	endTag.await();
	System.out.println("所有运动员到达,统计比赛名次");

	} catch (Exception e) {
			e.printStackTrace();
	}

	}

}


 

 

 

 

方法await(long timeout,TimeUnit unit)

此方法的作用是使线程在指定的最大时间单位内进入WAITING状态,如果超过这个时间则自动唤醒,程序继续向下运行。

参数timeout是等待的时间,unit参数是时间的单位。


JDK API

使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。

如果当前计数为零,则此方法立刻返回 true 值。

如果当前计数大于零,则出于线程调度目的,将禁用当前线程,且在发生以下三种情况之一前,该线程将一直处于休眠状态:

  • 由于调用 countDown() 方法,计数到达零;或者
  • 其他某个线程中断当前线程;或者
  • 已超出指定的等待时间。

如果计数到达零,则该方法返回 true 值。 

	public class MyService {
	
	        public CountDownLatch count = new CountDownLatch(1);
	
	        public void testMethod() {
	
	        try {
	
	        System.out.println(Thread.currentThread().getName() + "准备" + System.currentTimeMillis());
	        count.await(3, TimeUnit.SECONDS);
	        System.out.println(Thread.currentThread().getName() + "结束" + System.currentTimeMillis());
	
	        } catch (Exception e) {
	                e.printStackTrace();
	        }
	
	        }
	
	}
	public class MyThread extends Thread {
	
	        private MyService service;
	
	        public MyThread(MyService service) {
	                this.service = service;
	        }
	
	        @Override
	        public void run() {
	                service.testMethod();
	        }
	
	}
	
	public class Run {
	
	        public static void main(String[] args) {
	
	        MyService service = new MyService();
	        MyThread[] tArr = new MyThread[3];
	        for (int i = 0; i < tArr.length; i++) {
	                tArr[i] = new MyThread(service);
	        }
	
	        for (int i = 0; i < tArr.length; i++) {
	                tArr[i].start();
	        }
	
	        }
	
	}
	
	输出结果:
	        Thread-0准备1496366982943
	        Thread-2准备1496366982943
	        Thread-1准备1496366982943
	        Thread-1结束1496366985954
	        Thread-2结束1496366985954
	        Thread-0结束1496366985954
	        
从代码中可以看出,没有调用countDown () 方法,超时后,程序自动往下执行


 

 

 

方法getCount()的使用

该方法作用是:获取当前计数器的值。

public class Run {

	public static void main(String[] args) {

	CountDownLatch down = new CountDownLatch(3);

	System.out.println("1-- " + down.getCount());
	down.countDown();
	System.out.println("2-- " + down.getCount());
	down.countDown();
	System.out.println("3-- " + down.getCount());
	down.countDown();
	System.out.println("4-- " + down.getCount());
	down.countDown();
	System.out.println("5-- " + down.getCount());
	}

}
输出结果:
	1-- 3
	2-- 2
	3-- 1
	4-- 0
	5-- 0
	
从结果看出,当计数器为 0 时,再次调用 countDown() ,计数器数量也不会再下降。

JAVA:CountDownLatch 并发工具的技术指南 摘要:CountDownLatch是Java并发编程中的重要同步工具,通过计数器机制实现线程协调。初始化时设定计数器值,线程完成任务调用countDown()递减,主线程通过await()等待计数器归零后继续执行。适用于多线程任务等待、并发模拟等场景,如主线程等待子线程完成、性能测试中的并发请求控制等。需注意其一次性特性,计数器归零后不可重用。核心方法包括countDown()和await(),能有效简化并行任务处理和并发控制,但要注意线程安全和超时设置。合理使用可使并发编程更清晰可控。 阅读详情

相关推荐

【强化学习】常用算法之一 “A3C”

A3C(Asynchronous Advantage Actor-Critic)算法是一种在强化学习领域中应用广泛的算法,它结合了策略梯度方法和价值函数的学习,用于近似解决马尔可夫决策过程(Markov Decision Process)问题。A3C算法在近年来备受关注,因为它在处理大规模连续动作空间和高维状态空间方面具有出色的性能。A3C算法是一种基于策略梯度的强化学习算法,通过多个并行的智能体异步地与环境交互,并利用Actor和Critic网络实现策略和价值的近似,从而实现快速而稳定的强化学习训练。

Code_and516的博客 6756

CountDownLatch

CountDownLatch是一个同步协助类,允许一个或多个线程等待,直到其他线程完成。 CountDownLatch和Thread.join的区别: 1、join的实现是不停的去监测join线程是否存活,如果join线程存活就让当前线程等待 2、CountDownLatch是调用count.countDown();方法使计数器减一 CountDownLatch和CyclicBarrier(回环栅栏)的区别: 1、CountDownLatch不可以复用,而CyclicBarrier的计数器达到0时,会重置,

weixin_44130094的博客 1122

IBM System x3650 M5 IMM配置

1、IMM基本介绍 IMM,全称是Intel Mobile Module是IBM服务器上的集成管理模块,该模块是独立于服务器系统,可以通过一个单独的IP地址,使用Web和虚拟端口方式直接启动、停止和管理远程服务器,即使主板、处理器或者内存故障导致主机无法启动,也依然可以远程管理服务器,可以远程直接操作启动画面和服务器工作界面。 2、IP地址配置 2.1 通过Web方式修改IP地址 IBM服...

血饮渊虹的博客 4万+

多线程之CountDownLatch的用法及原理笔记

前言-CountDownLatch是什么? CountDownLatch是具有synchronized机制的一个工具,目的是让一个或者多个线程等待,直到其他线程的一系列操作完成。 CountDownLatch初始化的时候,需要提供一个整形数字,数字代表着线程需要调用countDown()方法的次数,当计数为0时,线程才会继续执行await()方法后的其他内容。CountDownLatch(int...

独行侠梦的博客 1325

STM32F103C8T6与OV7670摄像头在TFT屏上的实时数字识别系统实现

本文详细介绍了基于STM32F103C8T6单片机和OV7670摄像头实现实时数字识别系统的全过程。系统通过图像采集、预处理、二值化和模板匹配算法,在TFT屏上实时显示识别结果,并针对资源受限的单片机环境提供了内存与性能优化策略,适用于智能家居、工业仪表读数等低成本嵌入式视觉应用场景。

open4的博客 278

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能)

本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。

weixin_30952535的博客 816

Java浅谈CountDownLatch的用法

await() 方法是用来阻塞线程的,等待倒计锁被减到0的时候,才会唤醒该方法继续执行。也可以设置等待超时时间,如 countDownLatch.await(30, TimeUnit.SECONDS),设置超时时间则需要判断等待结果,true等待未超时、false等待已超时。countDown() 方法是用来执行线程计数器-1的,也就是多线程运行完之后,都调用此方法将计数器变成0,最后调用await()方法唤醒阻塞的位置,继续执行。1、countDown() 是用来执行倒计锁 -1。

hkl_Forever的博客 3377

【Oracle数据库】Oracle11g数据库下载与安装教程(超详细安装图解)

Oracle11g是Oracle公司出的一个比较轻量版的数据库,这里重点说一下在window系统上如何安装Oracle11g, Oracle11g是很早之前的安装包,win7 系统安装时不会遇到环境不满足最低要求的提示,win11系统安装时会提醒环境不满足,修改配置文件即可(注意:先安装oracle服务端/oracle客户端,再安装第三方工具(PL/ SQL Developer,DBeaver等)服务器端环境概述:ORACLE数据库版本:Oracle 11g 64位(11.2.0)

qq_34463511的博客 1万+

CountDownLatch使用及原理

任务时间长是因为统计指标多,而且指标是串行的方式去进行统计的,我们只需要考虑把这些指标从串行化的执行方式改成并行的执行方式,那么整个页面的时间的渲染时间就会大大的缩短, 如何让多个线程同步的执行任务,我们这里考虑使用多线程,每个查询任务单独创建一个线程去执行,这样每个统计指标就可以并行的处理了。统计报表页面涉及到的统计指标数据比较多,每个指标需要单独的去查询统计数据库数据,单个指标只要几秒钟,但是页面的指标有10多个,所以整体下来页面渲染需要将近一分钟。构建阻塞队列的双向链表,挂起当前线程。...

wa_chit_80407290的博客 867

DeepLabv3+改进68:全网首发-添加DBlock模块 |高效且鲁棒的多任务低光图像修复神经网络

本文提出了一种高效鲁棒的多任务低光图像修复神经网络DarkIR,针对夜间或昏暗条件下图像存在的噪点、光线不足和模糊问题。不同于现有方法分别处理去模糊和低光增强任务,该模型采用新的注意力机制增强CNN感受野,在降低计算成本的同时,在LOL-Blur、LOLv2和Real-LOLBlur数据集上取得最优结果,并能良好泛化到真实夜间图像。

AIcurator的博客 325

3D扩散模型的构建与优化:多模态融合在三维物体生成中的作用【附核心代码实例】

随着技术的发展,基于扩散模型的3D内容生成已经成为一个激动人心的领域。通过不断优化扩散模型的结构和算法,结合多模态信息、视角控制和高效网络架构,未来的3D生成技术将不仅能够生成逼真的物体,还能满足虚拟现实、游戏设计、电影制作等行业对高质量、实时生成的需求。

一键难忘的博客 2862

并发编程工具类-CountDownLatch的使用和原理解析

1、CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。 2、CountDownLatch 常用

stay hungry,stay foolish! 950

C2000ware介绍

C2000的下载安装指南C2000目录。

小柚子的博客 2796

【并发控制核心技术】:掌握CountDownLatch超时机制的3个关键点

掌握CountDownLatch的超时机制,有效避免线程无限阻塞。详解await超时返回的应用场景、超时参数设置与异常处理策略,提升并发程序稳定性与响应速度。合理使用可增强系统容错能力,值得收藏。

QuickCode的博客 287

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【并发编程】CountDownLatch

CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。统计报表页面涉及到的统计指标数据比较多,每个指标需要单独的去查询统计数据库数据,单个指标只要几秒钟,但是页面的指标有10多个,所以整体下来页面渲染需要将近一分钟。

m0_62645012的博客 1957

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 并发工具 CountDownLatch 技术详解

是 Java 并发包中极为实用的同步工具,适合一等多、一致性等待场景;其设计基于 AQS,线程安全且高效,使用简单,但不可重用,需注意死锁和异常分支;结合线程池、异步框架、分布式组件可拓展至更大规模和复杂场景;与 CyclicBarrier、Semaphore 各有侧重,应结合实际业务需求选型;掌握其原理与最佳实践,有助于构建高效、健壮的并发程序。一句话总结:CountDownLatch 是并发流程的“集结号”,让主流程等待所有子任务归队后再统一出发。

IT技术学习与工作笔记分享 802

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

并发编程CountDownLatch浅析

并发编程CountDownLatch浅析

似霰的博客 1418

【Java 并发】CountDownLatch 介绍

的核心特点在于它是一种倒计数器, 初始值设定为某个正整数。在多线程任务中, 当一个线程完成了一定的操作, 可通过调用 countDown() 方法来使计数器减 1, 而其他线程可通过 await() 方法等待计数器变为零。一旦计数器变为零, 等待的线程将被唤醒继续执行。为了能够理解 CountDownLatch, 举一个很通俗的例子。运动员进行跑步比赛时, 假设有 6 名运动员参与比赛, 裁判员在终点会为这 6 名运动员分别计时, 可以想象每当一个运动员到达终点的时候,

LCN29的博客 1058

CountDownLatch——高并发场景的并发控制器

并发控制如同交响乐团的指挥,CountDownLatch就是那根精准的指挥棒” —— 来自一位凌晨三点debug的程序员 🎻💻。

dhrmt的博客 1135

[Java] CountDownLatch 模拟高并发

参考: Class CountDownLatch Coordinating threads with CountDownLatch一、简介CountDownLatch 是 java.util.concurrent 包下的一个同步辅助类,它能使一个或多个线程在其他的线程的一系列操作完成之前一直等待,初始化值为计数器大小(即线程数量)。二、使用场景 同时启动多个线程; 多个线程操作完成之前一直等待。

列苗 6893

并发工具之CountDownLatch

本文详细讲解CountDownLatch,它是一个同步助手,允许一个或多个线程等待一系列的其他线程执行结束。并通过微信支付订单处理案例进行实战体验。

song1995924的博客 329

Java并发编程三大神器之CountDownLatch

1、CountDownLatch是什么 2、官网应用demo 2.1、CountDownLatch 官网demo1 2.2、CountDownLatch 官网demo2 3、开发中的应用小栗子 3.1、栗子1:【多个线程等待】模拟并发,让并发线程一起执行 3.2、栗子2:【单个线程等待】多个线程(任务)完成后,进行汇总合并 4、CountDownLatch 实现原理 5、CountDownLatch 结语

michael_linux的博客,一个小小小学生。滴水穿石,步步为营,只为那刹那芳华。 1239

Java并发之CountDownLatch

Java并发之CountDownLatch 目录 Java并发之CountDownLatch 1、什么是CountDownLatch 2、CountDownLatch如何工作的 3、方法说明 4、实例:一个线程等待其他线程运算结果,其他线程不需要阻塞等待 6、源码分析: 7、CountDownLatch内部实现: 7.1 await内部实现流程: 7.2 countDown内部...

Eric的博客 498

CountDownLatch的高并发与顺序执行

一、高并发: @Service public class ConcurrentTest {     /**      * 线程数量      */     public static final int THREAD_NUM = 100;     /**      * 开始时间      */     private static long startTime = 0L;     @Pos...

sprita1的专栏 1064

并发闭锁之CountDownLatch和FutureTask

闭锁:一种同步工具类,可以用来确保某些活动指导其他活动都完成后才执行。 CountDownLatch:一种闭锁的实现,可以使一个或多个线程等待一组事件发生。 FutureTask:一种闭锁的实现 ...

qq_36955645的博客 3130

Android 并发编程—CountDownLatch

1.CountDownLatch 一个同步工具类,它允许一个或多个线程一直等待,直到其他线程运行完成后再执行。它内部有一个计数器和一个阻塞队列,每当一个线程调用countDown()方法后,计数器的值减少1。当计数器的值不为0时,调用await()方法的线程会被加入到阻塞队列,一直阻塞到计数器的值为0。 常用方法: public class CountDownLatch { public CountDownLatch(intent count);//构造一个值为count的计数器 public void a

zenmela2011的专栏 3818
上一篇: 并发技术_2_Exchanger
下一篇: 并发技术_4_CyclicBarrier
Simba_cheng
博客等级 码龄11年 250粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值