📅  最后修改于: 2023-12-03 15:31:56.915000             🧑  作者: Mango
在并发编程中,CountDownLatch(倒计数门栓)是一个非常有用的工具类。CountDownLatch的作用就是让一个或多个线程等待其他线程完成任务后再继续执行,并且可以阻塞一个或多个线程等待其它线程完成某些操作。
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程数,每当一个线程完成了任务后,计数器的值就会减1,当计数器的值被减到0时,就表示所有的线程都已经完成了任务,等待在CountDownLatch上的线程就可以继续执行了。
CountDownLatch有两个重要方法,即await和countDown。
CountDownLatch适用于在一个或多个线程要等待其他线程完成任务后再继续执行的场景,比如多个线程一起执行某一个任务,需要等待所有线程都完成任务后,再执行下一步操作。
CountDownLatch的代码实现比较简单,以下代码演示了CountDownLatch的使用:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
final int count = 5;
final CountDownLatch latch = new CountDownLatch(count);
for (int i = 0; i < count; i++) {
new Thread(() -> {
try {
// 模拟线程执行任务的时间,当前线程耗时3秒
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " 执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 每执行完一个任务,countDown一次
latch.countDown();
}
}).start();
}
// 等待所有线程完成任务
latch.await();
System.out.println("所有线程执行完毕");
}
}
该示例会启动5个线程,每个线程都会耗时3秒钟。主线程调用await
方法等待所有线程执行完毕,当所有线程都执行完毕后,主线程才会继续执行。
输出结果为:
Thread-0 执行完毕
Thread-3 执行完毕
Thread-1 执行完毕
Thread-2 执行完毕
Thread-4 执行完毕
所有线程执行完毕
CountDownLatch是一个非常有用的工具类,它可以让多个线程协同完成某一任务,并且可以制造一个线程等待的效果,非常实用。但在使用的时候,需要注意控制计数器的值,不能出现计数器一直不为0的情况,否则会一直等待。同时,当计数器的初始值为1时,与使用Object对象的wait()和notify()方法类似。