江明涛的博客
使用 CountdownLatch 实现线程等待
使用 CountdownLatch 实现线程等待

使用 CountdownLatch 实现线程等待

使用 CountdownLatch 实现线程等待

在并发编程中,经常会遇到多个线程需要等待某个条件完成后再继续执行的情况。传统的做法是使用线程的 join() 方法,但是该方法只能用于等待单个线程的结束,无法满足多线程同时等待的需求。

CountdownLatch(倒计时门栓)是 Java 提供的一种同步工具,可以用于实现线程的等待功能。它允许一个或多个线程等待其他线程的完成。

下面我们来看一个使用 CountdownLatch 实现线程等待的示例:

import java.util.concurrent.CountDownLatch;
// 初始化倒计时门栓为1
CountDownLatch latch = new CountDownLatch(1);
public class WaitThread extends Thread {
    @Override
    public void run() {
        try {
            Thread.sleep(2000); // 模拟耗时操作
            System.out.println("等待任务完成...");
            latch.await(); // 等待倒计时门栓减到0
            System.out.println("任务完成,继续执行...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class TaskThread extends Thread {
    @Override
    public void run() {
        try {
            System.out.println("执行任务...");
            Thread.sleep(5000); // 模拟耗时操作
            System.out.println("任务完成");
            latch.countDown(); // 倒计时门栓减1
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        WaitThread waitThread = new WaitThread();
        TaskThread taskThread = new TaskThread();
        
        waitThread.start();
        taskThread.start();
    }
}

在上面的代码中,我们首先初始化了一个 CountDownLatch 对象,初始计数为1。然后创建了一个等待线程 WaitThread 和一个执行任务的线程 TaskThread。在 WaitThread 中,我们通过调用 latch.await() 方法使线程等待,直到倒计时门栓的计数减到0。而在 TaskThread 中,当任务执行完成时,我们通过调用 latch.countDown() 方法将倒计时门栓的计数减1。

运行上面的代码,我们可以看到 WaitThread 在执行 latch.await() 方法之后等待任务完成,而 TaskThread 在执行完任务之后调用 latch.countDown() 方法。当倒计时门栓的计数减到0时,WaitThread 继续执行并打印出 “任务完成,继续执行…”。

使用 CountdownLatch 实现线程等待可以有效地控制多线程的执行顺序和协作,提高代码的可读性和可维护性。