CountDownLatch是concuurent包里的一个工具类,它是一个计数器,它允许一个或者多个线程一直在等待,直到所有线程全部执行完成之后再执行。
CountDownLatch是什么
untDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
CountDownLatch的伪代码如下所示:
//Main thread start
//Create CountDownLatch for N threads
//Create and start N threads
//Main thread wait on latch
//N threads completes there tasks are returns
//Main thread resume execution
CountDownLatch如何工作
CountDownLatch.java类中定义的构造函数:
1
2
//Constructs a CountDownLatch initialized with the given count.
public void CountDownLatch(int count) {...}
构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。
与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。
其他N 个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。这种通知机制是通过 CountDownLatch.countDown()方法来完成的;每调用一次这个方法,在构造函数中初始化的count值就减1。所以当N个线程都调 用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。
在实时系统中的使用场景
让我们尝试罗列出在java实时系统中CountDownLatch都有哪些使用场景。我所罗列的都是我所能想到的。如果你有别的可能的使用方法,请在留言里列出来,这样会帮助到大家。
实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。
死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。
在这个例子中,我模拟了一个应用程序启动类,它开始时启动了n个线程类,这些线程将检查外部系统并通知闭锁,并且启动类一直在闭锁上等待着。一旦验证和检查了所有外部服务,那么启动类恢复执行。
CountDownLatch使用例子
AbstractBaseRuleHandler.java:这个类是一个Runnable,负责所有特定的外部服务健康的检测。它删除了重复的代码和闭锁的中心控制代码
public abstract class AbstractBaseRuleHandler implements Runnable {
private CountDownLatch latch;
private List<Long> errorList;
private Long primaryId;
public AbstractBaseRuleHandler(CountDownLatch latch,List<Long> errorList,Long primaryId) {
this.latch =latch;
this.errorList = errorList;
this.primaryId =primaryId;
}
@Override
public void run() {
try {
int i = handleOpration(primaryId);
if(i == 0){
errorList.add(primaryId);
}
}catch(Exception e){
ThreadLocalLog.infoPro(AbstractBaseRuleHandler.class.getName(), "run",primaryId + ":删除模版关联规则出错"+ e.getMessage(), null, null);
}finally{
latch.countDown();
}
}
public abstract int handleOpration(Long id);
}
TemplateRuleDelBean.java 这个类继承了AbstractBaseRuleHandler,实现了handleOpration()方法。
public class TemplateRuleDelBean extends AbstractBaseRuleHandler{
/**
* @param latch
* @param errorList
* @param primaryId
*/
public TemplateRuleDelBean(CountDownLatch latch, List<Long> errorList, Long primaryId) {
super(latch, errorList, primaryId);
}
@Override
public int handleOpration(Long id) {
return 0;//ruleBaseConfigEntityMapper.updateByPrimaryKeySelective(entity);
//本来做跟新操作,现在直接返回0
}
}
TempateDelSingleton.java 这个类是一个主启动类,它负责初始化闭锁,然后等待,直到所有服务都被检测完。
public class TempateDelSingleton {
private TempateDelSingleton() {
}
private static class TemplateInner{
private static final TempateDelSingleton incetance = new TempateDelSingleton();
}
public static TempateDelSingleton getIncetance(){
return TemplateInner.incetance;
}
public List<Long> handleMain(List<Long> primaryList){
CountDownLatch _latch= new CountDownLatch(primaryList.size());
List<Long> errorList = new ArrayList<>();
List<AbstractBaseRuleHandler> baseList = new ArrayList<>();
for(Long ab : primaryList){
baseList.add(new TemplateRuleDelBean(_latch, errorList, ab));
}
ExecutorService executor = Executors.newFixedThreadPool(baseList.size());
for(final AbstractBaseRuleHandler v : baseList){
executor.execute(v);
}
try {
_latch.await();
} catch (InterruptedException e) {
}finally{
executor.shutdown();
}
return errorList;
}
}
最后用main 跑一下这个单例 即可去检测一下闭锁的功能了。
public static void main(String[] args) {
List<Long> primaryList = Arrays.asList(1l,2l,3l);
TempateDelSingleton.getIncetance().handleMain(primaryList);
}
输出结果:
1
3
2
一些其他的CountDownLatch相关的问题:
解释一下CountDownLatch概念?
CountDownLatch 和CyclicBarrier的不同之处?
给出一些CountDownLatch使用的例子?
CountDownLatch 类中主要的方法?
分享到:
相关推荐
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
《多线程编程实战指南-核心篇》是针对Java开发者深入理解并掌握多线程编程的一本实战性书籍。在当今的并发计算环境中,多线程技术是必不可少的知识点,它能够有效地利用多核处理器资源,提高程序的执行效率。本书以...
《Java多线程编程实战指南》是一本深入探讨Java并发编程的书籍,涵盖了核心篇与设计模式篇。这本书旨在帮助开发者理解和掌握Java平台上的多线程编程,提升系统性能和可扩展性。在Java世界中,多线程是实现并发处理、...
《Java多线程编程实战指南 设计模式篇》是一本深度探讨Java并发编程与设计模式融合的书籍。在Java编程中,多线程是提升系统性能、实现并行计算的关键技术,而设计模式则是解决常见问题的最佳实践。本书旨在帮助...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
根据提供的文件信息,“Java项目开发实战”这一主题主要聚焦于Java项目的实际开发过程与技巧,适合初学者作为入门指南来了解Java项目开发的基本流程和技术要点。下面将从多个角度深入探讨这一主题涉及的关键知识点。...
总之,《Java 并发编程实战》是一本全面、深入的并发编程指南,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的见解和实战经验。通过阅读本书,你将能够更好地应对多线程环境中的挑战,编写出更加健壮、高...
《Java 7并发编程实战手册》是一本深入探讨Java并发编程的权威指南,它涵盖了Java 7版本中的并发工具和最佳实践。这本书的源码打包提供了丰富的实例,可以帮助读者更好地理解并应用书中所讲解的概念。这里我们将详细...
在Java编程语言的世界里,程序员们常常面临各种各样的陷阱和难题。...这份“Java避坑指南:Java高手笔记代码篇”应该包含了这些领域的实战经验和示例代码,为读者提供了一条避开陷阱、提升技能的道路。
《Java 7并发实战》是一本专为Java开发者设计的指南,旨在帮助他们深入理解和熟练应用并发编程和多线程技术。在Java平台中,并发处理是构建高性能、可扩展和响应迅速的应用程序的关键要素。Java 7版本引入了一些新的...
本资源“java并发原理与实战pdf”提供了一套深入理解和实践Java并发的指南,适合希望提升并发编程能力的开发者阅读。 首先,Java并发的基础在于线程,线程是操作系统分配CPU时间的基本单位。在Java中,可以通过`...
《汪文君Java高并发实战编程》是一本深入探讨Java多线程与并发控制的实践指南,由知名技术专家汪文君撰写。本书主要针对Java程序员,旨在帮助他们理解和掌握在高并发环境下如何设计和优化应用程序。以下是该书可能...
总的来说,《Java并发编程实战》中文版是一本深入浅出的并发编程指南,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的知识和启示。通过学习书中的内容,你将具备驾驭Java并发编程的能力,写出更健壮、高效...
以上只是部分可能包含在指南中的内容,实际面试时还可能涉及项目经验、性能优化、问题排查等实战技能。通过深入学习和实践这些知识点,不仅可以为面试做好充分准备,也能提升日常开发的效率和代码质量。
以上只是《高性能Java系统权威指南》可能涉及的部分知识点,实际内容会更丰富,涵盖更多实际案例和实战经验,帮助读者深入理解并掌握Java性能优化的方方面面。通过学习和实践这些知识,可以让你的Java应用程序运行得...
Java作为一门广泛使用的编程语言,尤其在企业级应用开发...无论是进行性能优化还是解决并发问题,这份"Java多线程编程实战指南-核心篇"都是你不可或缺的参考资料。投入时间和精力深入学习,你将在Java世界中更进一步。
这个压缩包包含的是一个SCJP认证考试的备考指南,由10个PDF文件组成,每个文件可能对应不同的章节,按照章节顺序排列,从基础到深入地讲解了Java编程的关键知识点。 1. **chap1.pdf** - 可能涵盖Java语言基础,包括...
《Java性能权威指南》是一本深受Java开发者喜爱的进阶读物,专注于讲解如何优化Java应用程序的性能。这本书详尽地探讨了Java性能调优的各个方面,为读者提供了丰富的实践经验和理论知识,帮助开发者深入理解Java平台...
《2023Java并发编程手册》是一部全面覆盖Java并发编程领域的指南。本书首先从Java并发编程的基础知识入手,涵盖了线程、锁、并发集合、同步和死锁等核心概念。随后,深入探讨了Java中的并发模式和技术,包括但不限于...