返回

CountDownLatch:实现线程安全、可靠等待任务完成的并发工具

Android

在Java并发编程中,经常需要一个线程等待其他多个线程完成任务后,再继续执行。这时,CountDownLatch就派上用场了。CountDownLatch是一个同步工具类,它允许一个或多个线程等待其他线程完成工作后,再执行。

CountDownLatch的工作原理

CountDownLatch的原理很简单,它维护着一个计数器,初始值为线程的数量。当某个线程完成任务后,调用countDown()方法,计数器减1。当计数器变为0时,等待的线程被唤醒,继续执行。

CountDownLatch的应用场景

CountDownLatch的应用场景非常广泛,包括:

  • 启动一个框架或系统时,需要等待所有组件初始化完成后,再启动主程序。
  • 多个线程同时处理一个任务,需要等待所有线程都完成任务后,再继续执行。
  • 多个线程同时访问一个资源,需要等待所有线程都释放资源后,再允许其他线程访问。

CountDownLatch的用法

CountDownLatch的用法也非常简单,只需以下三个步骤:

  1. 创建一个CountDownLatch对象,并指定计数器的初始值。
  2. 当某个线程完成任务后,调用countDown()方法,计数器减1。
  3. 当计数器变为0时,等待的线程被唤醒,继续执行。

CountDownLatch的示例代码

下面是一个使用CountDownLatch的示例代码:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

    public static void main(String[] args) {
        // 创建一个CountDownLatch对象,并指定计数器的初始值为3
        CountDownLatch latch = new CountDownLatch(3);

        // 启动三个线程,每个线程都执行一个任务
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                // 执行任务
                System.out.println("线程" + Thread.currentThread().getName() + "正在执行任务");

                // 调用countDown()方法,计数器减1
                latch.countDown();
            }).start();
        }

        // 等待所有线程完成任务
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 所有线程都完成任务后,继续执行
        System.out.println("所有线程都完成任务了");
    }
}

总结

CountDownLatch是一个非常有用的并发工具,它可以帮助我们实现线程安全、可靠地等待任务完成。在实际开发中,CountDownLatch的应用场景非常广泛,包括启动框架或系统、多个线程同时处理任务、多个线程同时访问资源等。掌握CountDownLatch的使用方法,可以大大提高开发效率。