1、类介绍
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行
2、使用场景
在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这个时候就可以使用CountDownLatch。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。
3、方法说明
countDown
public void countDown()
如果当前计数等于零,则不发生任何操作。
await
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
true
值。
如果当前计数大于零,则出于线程调度目的,将禁用当前线程,且在发生以下三种情况之一前,该线程将一直处于休眠状态:
- 由于调用
countDown()
方法,计数到达零;或者 - 其他某个线程中断当前线程;或者
- 已超出指定的等待时间。
如果计数到达零,则该方法返回 true
值。
如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在等待时被中断,
则抛出 InterruptedException
,并且清除当前线程的已中断状态。如果超出了指定的等待时间,则返回值为 false
。如果该时间小于等于零,则此方法根本不会等待。
timeout
- 要等待的最长时间unit
- timeout
参数的时间单位。true
;如果在计数到达零之前超过了等待时间,则返回 false
InterruptedException
- 如果当前线程在等待时被中断package cn.com.common.thread; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * @ClassName: CountDownLatchTest * @Description:CountDownLatch使用 * @author linsky328 * @date 2017年7月4日 下午4:28:01 * */ public class CountDownLatchTest { // 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。 public static void main(String[] args) throws InterruptedException { // 开始的倒数锁 final CountDownLatch begin = new CountDownLatch(1); // 结束的倒数锁 final CountDownLatch end = new CountDownLatch(10); // 十名选手 final ExecutorService exec = Executors.newFixedThreadPool(10); for (int index = 0; index < 10; index++) { final int NO = index + 1; Runnable run = new Runnable() { public void run() { try { // 如果当前计数为零,则此方法立即返回。 // 等待 begin.await(); long time = (long) (Math.random() * 1000); Thread.sleep(time); System.out.println("No." + NO + " arrived"+",time is:"+time); } catch (InterruptedException e) { } finally { // 每个选手到达终点时,end就减一 end.countDown(); } } }; exec.submit(run); } System.out.println("Game Start"); // begin减一,开始游戏 begin.countDown(); // 等待end变为0,即所有选手到达终点 end.await(); System.out.println("Game Over"); exec.shutdown(); } }运行结果
Game Start No.7 arrived,time is:226 No.5 arrived,time is:229 No.8 arrived,time is:249 No.1 arrived,time is:391 No.4 arrived,time is:457 No.3 arrived,time is:504 No.10 arrived,time is:631 No.2 arrived,time is:757 No.9 arrived,time is:792 No.6 arrived,time is:936 Game Over
相关推荐
CountDownLatch是Java并发编程中一个重要的工具类,用于协调多线程间的同步。它由Java并发包`java.util.concurrent`提供,主要用于解决一种场景:在主控线程等待多个子线程完成各自任务后再继续执行的情况。下面我们...
7. **并发工具类的使用**:包括`ExecutorService`、`CountDownLatch`、`CyclicBarrier`和`Semaphore`等,这些工具可以帮助我们更有效地管理线程和同步,以实现高效的多核编程。 8. **性能优化技巧**:理解并合理...
8. **并发工具类**:如Semaphore、CyclicBarrier、CountDownLatch等,它们可以帮助简化多线程间的协调和同步,避免死锁和竞态条件。 9. **泛型**:泛型提高了代码的类型安全性,减少了强制类型转换。理解泛型的边界...
Java 使用 CountDownLatch 等待多线程全部执行完成 CountDownLatch 是 Java 中的一个同步工具类,允许一个或多个线程等待其他线程完成操作。它的应用场景非常广泛,例如在处理大量数据时,可以使用多线程的方式处理...
4. **并发工具类**:Java的并发包(java.util.concurrent)包含许多高效并发工具,如CountDownLatch、CyclicBarrier、Future和Callable,它们在多线程编程中扮演重要角色。 5. **并发集合**:线程安全的集合类,如...
在Java并发编程中,`CountDownLatch`是一个非常重要的工具类,它位于`java.util.concurrent`包下,用于协调多个线程间的同步。...理解和熟练使用`CountDownLatch`对于编写高效的多线程Java程序至关重要。
java并发编程中CountDownLatch和CyclicBarrier的使用借鉴 java并发编程中CountDownLatch和CyclicBarrier是两个非常重要的线程控制和调度工具,经常被用于解决多线程程序设计中的线程等待问题。本文将对...
在Java并发编程中,CountDownLatch和CyclicBarrier是两种非常重要的同步工具类,它们用于协调多个线程间的协作。这两个工具都是在`java.util.concurrent`包下,是Java并发库的重要组成部分。 **CountDownLatch** ...
理解线程的生命周期、同步机制(synchronized、wait()、notify()等)以及并发工具类(如ExecutorService、Semaphore、CountDownLatch)是编写高性能程序的关键。 通过这个“实验前导课:Java基础练习上机实验”,...
本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。 CountDownLatch和CyclicBarrier是Java并发编程中两个非常有用的同步工具,它们在不同的场景下有着各自的优势。...
4. **Date和Time API**:Java 8对日期和时间API进行了全面重写,引入了`java.time`包,提供了更加灵活和易于使用的日期、时间、时区处理工具。 5. **默认方法**:在接口中引入了默认方法,允许接口定义实现,增强了...
JAVA多线程CountDownLatch使用详解 JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。...
`CountDownLatch`是Java并发包`java.util.concurrent`中的一个重要工具类,用于实现线程间的同步。它基于计数器的概念,初始化时设置一个非负的计数值,然后通过调用`countDown()`方法来递减这个计数器。主线程或...
在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...
Java谜题是对编程语言中一些不常见或者容易让人迷惑的特性的探讨,这些特性往往隐藏在日常编程的细节之中。Java作为一个广泛应用的面向对象编程语言,它的谜题往往涉及到类与对象、多线程、异常处理、内存管理等多个...
Java中CountDownLatch进行多线程同步详解及实例代码 CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对...
AQS 是 Java 并发库的核心之一,提供了构建锁和其他同步组件的基础框架。它通过维护一个名为 state 的共享变量来实现同步,这个变量用于记录锁的状态。 **核心方法:** - **`getState()`:** 获取 state 的当前值。...
3. **并发工具类**:Java并发包(java.util.concurrent)包含了许多工具类,如Semaphore(信号量)、CyclicBarrier(回环屏障)、CountDownLatch(计数器门锁)和ThreadPoolExecutor(线程池)。这些工具可以帮助...
Java.util包是Java编程语言中的核心包之一,它包含了大量用于日常编程的类和接口,是Java程序员必备的知识点。本教程重点讲解了Java.util包中的主要组件和使用方法,旨在帮助初学者深入理解并熟练运用这个包。 1. *...
Java编程语言是世界上最流行的开发平台之一,广泛应用于企业级应用、移动应用(尤其是Android系统)、大数据处理、云计算等领域。这份“Java解惑.pdf”文档很可能包含了解决Java开发者在编程过程中遇到的常见问题和...