CountDownLatch (倒计时器)
时间: 2023-11-03 21:58:52 浏览: 55
CountDownLatch(倒计时器)是Java中的一个同步工具类,它用于控制一个或多个线程等待其他线程完成,然后再继续执行。它的主要方法有三个:
1. `CountDownLatch(int count)`:实例化一个倒计数器,count指定计数个数。
2. `countDown()`:计数减一。
3. `await()`:等待,当计数减到0时,所有线程并行执行。
通过创建CountDownLatch的实例,我们可以初始化一个计数器,并在需要等待的线程中调用`await()`方法,使线程等待计数器归零。而在其他线程中,可以通过调用`countDown()`方法来使计数器减一,直到计数器归零时,等待的线程才会继续执行。
例如,考虑一个火箭发射的例子,在火箭发射前需要进行一系列的检查任务,只有所有的检查任务都完成了,火箭才能发射。这时候我们可以使用CountDownLatch来实现这个功能。我们创建一个CountDownLatch实例,初始计数器为检查任务的数量,每个检查任务完成时调用`countDown()`方法减少计数器,火箭等待的线程调用`await()`方法来等待计数器归零,在所有检查任务都完成后,计数器归零,火箭发射。
相关问题
countdownlatch
CountDownLatch 是Java的一个并发类,它提供了一种简单的方法,可以对多个线程的执行进行协调。倒计时锁存器(CountDownLatch)是一种同步工具,与信号量类似,它允许一个或多个线程等待一组事件的发生。CountDownLatch 对象内部有一个数值计数器,其初始值为一个正整数,这个值在 CountDownLatch 对象创建时被设定。在 CountDownLatch 的使用过程中,这个计数器值只能被减少,而不能被增加。
CountDownLatch 有两个关键方法,一个是await(),一个是countDown(),支持多个线程同时阻塞,它们的具体含义如下:
· countDown(): 使计数器减一。
· await(): 等待计数器变为0,此时唤醒所有等待线程。
当 countDown() 方法被某个线程调用时,CountDownLatch 对象内部的计数器就会减 1,同时会通知等待在 await() 方法上的线程。当计数器减到 0 时,await() 方法会被唤醒,所有等待线程将被释放,继续执行自己的任务。
CountDownLatch 常见的使用场景是,某个任务分成多个子任务去处理,只有当所有子任务都完成时,主任务才能继续执行。在这种场景下,可以使用一个计数器来追踪子任务的完成情况,当所有子任务都完成时,计数器为 0,可触发主任务继续执行。
总之,CountDownLatch 在多线程编程中起到了很重要的作用,它可以使线程同步执行,提高程序编程效率。在实际的开发应用中,CountDownLatch 可以广泛应用于多线程、分布式计算等场景,它的应用也逐渐受到大家的关注和认可。
Java并发编程-JUC-CountDownLatch 倒计数门闩器-等待多线程完成再放行 -一次性使用...
好的,您想了解关于Java并发编程中的CountDownLatch吗?
CountDownLatch是Java并发编程中非常重要的一个工具类,它可以让某个线程等待其他线程完成后再继续执行。它的作用类似于倒计时门闩,当count值减为0时,所有等待者都会被唤醒。
CountDownLatch是一次性的,也就是说,它的计数器只能使用一次。如果需要重复使用,可以考虑使用CyclicBarrier。
在使用CountDownLatch时,我们需要先创建一个CountDownLatch对象,并指定计数器的初始值。然后在需要等待的线程中调用await()方法进行等待,同时在其他线程中调用countDown()方法进行计数器的减1操作。
举个例子,假设我们有一个需求:主线程需要等待两个子线程完成后再执行。那么可以这样编写代码:
```java
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(2);
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "执行开始");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行完毕");
countDownLatch.countDown();
}, "线程1").start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "执行开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行完毕");
countDownLatch.countDown();
}, "线程2").start();
System.out.println(Thread.currentThread().getName() + "等待子线程执行完毕");
countDownLatch.await();
System.out.println(Thread.currentThread().getName() + "所有子线程执行完毕,继续执行主线程");
}
}
```
在上面的例子中,我们首先创建了一个计数器初始值为2的CountDownLatch对象,然后创建了两个线程分别进行一些操作,并在操作结束后调用countDown()方法进行计数器减1操作。在主线程中,我们调用await()方法进行等待,直到计数器减为0时,主线程才会继续执行。
希望能够对您有所帮助!
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)