CountDownlatch的使用

60 阅读2分钟

CountDownLatch 是 Java 提供的一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

以下是 CountDownLatch 的一个基本示例,展示了如何使用它来同步一个或多个执行任务的线程,确保所有任务完成后主线程再继续执行。

javaCopy code
final CountDownLatch latch = new CountDownLatch(1);

这行代码创建了一个 CountDownLatch 实例,其中的计数器被初始化为 1。这意味着在 CountDownLatch 上调用 await() 方法的线程会阻塞,直到计数器达到零。通常,这通过在其他线程中执行 countDown() 方法来实现,每调用一次就将计数器减 1

示例用法

假设你有一个简单的任务需要在一个单独的线程中执行,而主线程需要等待这个任务完成后才能继续执行:

javaCopy code
public class Main {
    public static void main(String[] args) throws InterruptedException {
        final CountDownLatch latch = new CountDownLatch(1);

        // 创建一个新的线程来执行任务
        Thread taskThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 在这里执行一些任务
                    System.out.println("任务执行中...");
                    Thread.sleep(1000); // 模拟任务执行时间
                    
                    // 任务完成后,调用countDown()减少锁存器的计数
                    latch.countDown();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        taskThread.start(); // 启动任务线程
        
        // 主线程在这里等待直到 latch 的计数器为0
        latch.await();
        System.out.println("任务完成,主线程继续执行。");
    }
}

在这个例子中,主线程启动了一个任务线程,然后通过调用 latch.await() 进入等待状态。任务线程执行结束后,会调用 latch.countDown(),这时计数器变为零,主线程的等待状态被解除,继续执行后续的代码。

CountDownLatch 是一种非常实用的同步机制,特别是在你需要等待一个或多个并行任务完成才能继续执行的场景中。