Java线程之CountDownLatch

利用多线程统计文件夹内所有文件的大小 利用jdk1.7中 Fork/join 多线程框架完成统计某个文件夹下所有文件的大小综合。关于 阅读详情

CountDownLatch是一个高级的线程同步工具,可以理解为一个闸门,先运行一些线程,计算出一些结果,满足条件后,开闸,然后另一些线程启动。换句话说,它将多个线程分为2类,一类开闸前运行,一类开闸后运行。

对于开闸后运行的线程,调用await()方法后,进入等待状态,等待开闸。它内部有一个计数器,初始状态计数器为用户设定的正整数,当开闸前某个线程运行完毕后,调用它的countDown()方法将计数器减1,当计数器为0时,开闸。

典型应用:统计硬盘上文件的数目。针对硬盘的每一个分区,例如C盘、D盘、E盘等,单独开一个线程统计该分区内的文件数。另设一个线程对所有分区的文件数汇总,显示给用户,此线程运行在开闸后,必须等每个分区都统计完毕之后,开闸,汇总报告给用户。countDown()方法最好不要由开闸前的线程直接调用,而应该由汇总线程对其进行封装,开闸前的线程之调用封装后的方法,CountDownLatch尽量对开闸前的线程透明。

/**
 * 负责将多线程查找的各分区文件数目合并汇总,
 * 打印出硬盘上存在的总文件数
 */
class CombineResult implements Runnable {

	private CountDownLatch latch;
	private long fileCount;
	
	public CombineResult(int n) {
		latch = new CountDownLatch(n);
		fileCount = 0;
	}
	
	public synchronized void commitResult(long count) {
		fileCount += count;
		latch.countDown();
	}
	
	@Override
	public void run() {
		try {
			latch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("\n硬盘上共有" + fileCount + "个文件");
	}
}

/**
 * 统计一个硬盘分区内的文件数
 */
class CountFilesInPartition implements Runnable{
	private CombineResult result;
	private Path partition;	//需要Java 1.7支持
	private long count;

	public CountFilesInPartition(CombineResult result, Path partition) {
		this.result = result;
		this.partition = partition;
		count = 0;
	}

	@Override
	public void run() {
		long n;
		n = countFiles(partition);
		result.commitResult(n);
	}
	
	private long countFiles(Path p) {
		if(Files.isDirectory(p)) {
			try(DirectoryStream<Path> paths = Files.newDirectoryStream(p)) {
				for(Path path:paths) {
					count = countFiles(path);
				}
			} catch (IOException e) {
			}
		}else {
			count++;
		}
		return count;
	}
}

/**
 * 进度条
 */
class ProgressBar extends Thread{
	private int interval;	//显示进度的时间间隔,单位是毫秒

	public ProgressBar(int interval) {
		this.interval = interval;
		setDaemon(true);
	}

	@Override
	public void run() {
		System.out.print("正在进行中");
		while(true) {
			try {
				Thread.sleep(interval);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.print(" .");
		}
	}
}

public class CountFile {
	public static void main(String[] args) {
		int ptCount = getPartitionCount();
		CombineResult result = new CombineResult(ptCount);
		new Thread(result).start();
		Iterable<Path> partitions = FileSystems.getDefault().getRootDirectories();
		for(Path p:partitions) {
			new Thread(new CountFilesInPartition(result, p)).start();
		}
		new ProgressBar(1000).start();
	}
	
	private static int getPartitionCount() {
		Iterable<Path> partitions = FileSystems.getDefault().getRootDirectories();
		int n = 0;
		for(Path p:partitions) {
			n++;
		}
		return n;
	}
}

以下是不使用CountDownLatch,而是直接使用Lock和Condition的实现,做一个对比

public class CountFiles {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long start = System.currentTimeMillis();
		Iterable<Path> drivers = FileSystems.getDefault().getRootDirectories();
		int n = 0;
		for(Path driver:drivers) {
			n++;
		}
		Result r = new Result(n);
		for(Path driver:drivers) {
			new MyThread(driver, r).start();
		}
		System.out.println(r.getFileCount());
		System.out.println(System.currentTimeMillis()-start);
	}
	
	private static class MyThread extends Thread {

		private Path driver;
		private long count;
		private Result result;
		
		public MyThread(Path driver, Result r) {
			super();
			this.driver = driver;
			count = 0;
			result = r;
		}

		@Override
		public void run() {
			countFiles(driver);
			result.addFileCount(count);
			result.cutThreadCount();
		}
		
		private void countFiles(Path path) {
			if(Files.isDirectory(path)) {
				DirectoryStream<Path> paths;
				try {
					paths = Files.newDirectoryStream(path);
					for(Path p:paths) {
						countFiles(p);
					}
				} catch (IOException e) {
				}
			}else {
				count++;
			}
		}
		
	}

	private static class Result {
		private long fileCount = 0;
		private int threadCount = 0;
		
		public Result(int n) {
			threadCount = n;
		}
		
		public synchronized void addFileCount(long n) {
			fileCount += n;
		}
		
		public synchronized long getFileCount() {
			while(threadCount >0) {
				try {
					wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return fileCount;
		}
		
		public synchronized void cutThreadCount() {
			threadCount--;
			notifyAll();
		}
	}
}


java多线程——CountDownLatch 是 Java 并发工具包 () 中提供的一个同步辅助类,用于协调多个线程之间的执行顺序。它允许一个或多个线程等待直到在其他线程中执行的一组操作完成。 阅读详情

相关推荐

【Java 多线程 6】countdownlatch用法

一、CountDownLatch简介 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。 二、CountDownL

学Java,找哪吒 6897

CountDownLatch实现多批次多任务处理

CountDownLatch实现多批次多任务处理

qq_32422371的博客 805

java多线程CountDownLatch简单测试

CountDownLatch 多线程

u013558123的博客 1298

假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?

  一般情况,我们实现多线程都是Thread或者Runnable(后者比较多),但是,这两种都是没返回值的,所以我们需要使用callable(有返回值的多线程)和future(获得线程的返回值)来实现了。/** * 假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现? *...

卖克的专栏 8065

CentOS7安装openGauss5.0.2LTS版本

该文档要根据自己的实际情况调整ip地址。要根据自己的实际网卡调整。

superhanyubo的专栏 2578

佳能C3025打印机扫描方法

佳能C3025彩色打印机扫描方法 步骤一、如果打印机处于休眠状态,可按图中标记的按钮唤醒打印机; 然后点击屏幕上的【扫描】 步骤二、扫描类型选择【文件】 步骤三、点击屏幕上的【地址簿】 步骤四、此时屏幕胡看到名字,如果看不到自己的名字,可往下滑动直到看到自己的名字,然后点击自己的名字,再点击右下角的【应用】 步骤五、点击【发送设置】,可看到文件格式为PDF,点击可以选择JPEG的图片格式。...

weixin_46019317的博客 2万+

有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?...

利用java.util.concurrent包下的CountDownLatch(减数器)或CyclicBarrier(循环栅栏) 转自:http://www.cnblogs.com/westward/p/7144620.html 实现1:用concurrent包下的CountDownLatch /** * 假如有Thread1、Thread2、Thread3、Thread4四条线...

weixin_33935777的博客 305

传感器融合的智能演进:ST-MC-Workbench中霍尔与编码器的协同控制策略

本文探讨了ST-MC-Workbench中霍尔传感器与编码器的协同控制策略,通过传感器融合技术提升电机控制精度。文章详细介绍了分层处理架构、霍尔安装角度优化及编码器Z脉冲容错机制,展示了在新能源汽车和工业应用中的实际效果,为高精度位置检测提供了解决方案。

weixin_29159441的博客 482

通过这道-----多线程任务统计磁盘来彻底搞懂JUC工具类的包

多线程任务统计磁盘题目一、CountDownLantch方式二、CyclicBarrier方式三、Semaphore方式 题目 假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现? 一、CountDownLantch方式 import java.util.concurrent.*; import static java.lang.System.out; public class M

烟花易冷 348

匈牙利算法解决指派问题清晰流程

匈牙利算法解决指派问题清晰流程 百度词条上,指派问题(Assignment problem)是这么定义的:在满足特定指派要求条件下,使指派方案总体效果最佳。如:有若干项工作需要分配给若干人(或部门)来完成;有若干项合同需要选择若干个投标者来承包:有若干班级需要安排在若干教室里上课等。   一、做减法(归约): 行归约:每行元素减去该行最小元素。 列归约:每行元素减去该行最小元素。

siss0siss的博客 6万+

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

Java 线程池 & CountDownLatch

在线程池中,由于各个线程不会真正意义上的结束,因此Thread.join()方法无法生效,此时使用CountDownLatch来确保线程间的正确顺序。

qq_43149840的博客 1334

ZYNQ工业级串口方案:AXI UART 16550扩展RS-485实战(自动方向控制+Linux驱动)

可以轻松扩展出多路工业级串口。但常规方案需要手动控制收发方向(DE/RE引脚),存在实时性差、CPU占用高等痛点。本文从硬件逻辑设计到Linux驱动开发,完整实现了ZYNQ平台的RS-485工业通信方案。,解决了传统方案实时性差的痛点。所有代码均经过实际项目验证,可直接用于生产环境。:尝试将此设计扩展为多协议兼容接口(支持RS-422/RS-232切换)!等特性,依然是现场总线通信的首选。,通过硬件逻辑+Linux驱动协同设计,实现零延迟切换。在工业自动化、能源电力等场景中,RS-485凭借。

QQ_778132974的博客 830

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

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

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

使用Python与OpenCV实现基于霍夫变换的圆形缺陷检测与定位详细教程

本文详细探讨了如何使用Python和OpenCV库,通过图像边缘检测和霍夫变换实现圆形对象的检测与缺陷定位。我们不仅介绍了算法的基本原理,还通过具体的代码示例展示了如何在实际应用中实现这些技术。对于工业检测和医学影像分析,本文的方法提供了高效且易于实现的解决方案。随着图像处理技术的不断发展,未来我们可以期待更多新算法和新技术的应用,如深度学习与传统方法的结合,以及多传感器融合技术的引入,这将进一步提升缺陷检测与定位的效率和准确性。

qq_38334677的博客 1295

用长tree方式做等长线

1)写一个sdc,把等长线的起点设置成clock source,用于创建create_clock,至于period和waveform等参数随便写即可。然后clock_opt -from build_clock -to route_clock即可。3)在正式cts之前或之后,给自己创建的scenario长tree并don't touch。前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。2)为该clock创建一个新mode,并创建对应的scenario。

m0_61544122的博客 622

Java中使用CountDownLatch进行多线程同步

CountDownLatch介绍在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法:1、synchronized关键字进行同步。2、Lock锁接口及其实现类ReentrantLock、ReadWriteLock锁实现同步。3、信号量Semaphore实现同步。其中,synchronized关键字和Lock锁解决的是多个线程对同一资源的并发访问问题。信号量Semaphore解决的是

Forever-守望 6767

VC中sqlite的使用

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

java多线程countdownlatch_JAVA多线程CountDownLatch使用详解

前序:上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现。经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但http://www.cppcns.com是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消除bug。什么时候用?多线程是在很多地方都会用到的,但是我们如果想要实现在某个特定的线程运行完之后,再启动另外一个线程呢,这个时候CountDownLatch就可...

weixin_39812046的博客 169

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JAVA 多线程编程之CountDownLatch

CountDownLatch 是一个非常实用的线程同步工具,在多线程编程中有着广泛的应用。它基于计数器的原理实现,通过等待计数器的值变成 0 来实现线程的同步和协作。在使用 CountDownLatch 时,需要注意初始计数值的设定和 countDown() 和 await() 方法的使用。本文介绍了 CountDownLatch 的基本原理和用法,并通过示例代码演示了它的使用。希望本文能够帮助读者更好地理解和应用 CountDownLatch,在实际的项目中提高多线程编程的效率和质量。

m88997766的博客 770

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 线程: CountDownLatch(最详解)

Java 线程:countDownLatch 1. 背景 countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 存在于java.util.cucurrent包下。 2. 概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或...

wBkvam 729

Java多线程之CountDownLatch使用

关于Java多线程之CountDownLatch使用 假设现在有6个学生在上晚自习,我们创建6个线程来代表6个学生,只有当6个学生都下晚自习出了教室之后,假设main线程代表班长,此时班才能锁门走人…也即是,前面6个学生线程执行完任务之后,mian线程才可执行,请看如何使用CountDownLatch实现: import java.util.concurrent.CountDownLatch; ...

大"升"说代码-Talking 237

Java线程:CountDownLatch 原理

CountDownLatch的使用 CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由线程进行减1操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒,实现线程间的同步。 public void startTestCountDownLatch() { int threadNum = 10; final CountDownL...

畅志聪的专栏 349

java 多线程之CountDownLatch

介绍 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待直到其他线程执行完毕才开始执行。 用给定的计数初始化CountDownLatch,其含义是需要等待多少个线程执行完再开始执行。 不论哪个线程,只要每次调用CountDown(),其计数都会减1,即需要等待的执行次数减1. 主程序执行到await()函数会进入阻塞状态(等待),等待线程的执行,直到计数为0,恢复正常态。 实现原理 CountDownLatch是通过一个计数器来实现的,计数器的初始化值为需要等待的线程执行.

♨ 350

countdownlatch java_JAVA多线程CountDownLatch使用详解

前序:上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现。经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消除bug。什么时候用?多线程是在很多地方都会用到的,但是我们如果想要实现在某个特定的线程运行完之后,再启动另外一个线程呢,这个时候CountDownLatch就可以派上用场了怎么用?先看看普通的多线程代码...

weixin_32307599的博客 430

java 多线程处理 countDownLatch

通过countDownLatch 计数器,来控制线程数及等待 释放 import com.base.api.CountDownLatchService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.Ar...

weixin_41003771的博客 290

Java多线程场景下 CountDownLatch、CyclicBarrier

在Java多线程编程中,CountDownLatch、Semaphore和CyclicBarrier是关键的同步工具,各自具有独特的功能和应用场景。CountDownLatch允许一个或多个线程等待其他线程完成特定操作,通过递减计数器实现线程的精准等待。CyclicBarrier则为一组线程提供一个同步点,使它们相互等待,直到所有线程都到达屏障点后继续执行。通过运动场比赛的代码示例,展示了CyclicBarrier用于同步运动员起跑,CountDownLatch用于统计比赛结束的场景。

技术人宝哥 1256
上一篇: Java线程之Semaphore
下一篇: Java实现希尔排序
andycpp
博客等级 码龄22年 698粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值