📜  Java中的CountDownLatch(1)

📅  最后修改于: 2023-12-03 15:31:56.915000             🧑  作者: Mango

Java中的CountDownLatch

在并发编程中,CountDownLatch(倒计数门栓)是一个非常有用的工具类。CountDownLatch的作用就是让一个或多个线程等待其他线程完成任务后再继续执行,并且可以阻塞一个或多个线程等待其它线程完成某些操作。

基本概念

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程数,每当一个线程完成了任务后,计数器的值就会减1,当计数器的值被减到0时,就表示所有的线程都已经完成了任务,等待在CountDownLatch上的线程就可以继续执行了。

CountDownLatch有两个重要方法,即await和countDown。

  • await():主线程调用此方法等待子线程完成任务,当计数器为0时,才继续往下执行。如果计数器不为0,则一直等待。
  • countDown():子线程调用此方法通知计数器减1,当计数器减至0时,主线程就会被唤醒继续执行。如果计数器已经为0,则该方法不会有任何作用。
适用场景

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()方法类似。