使用 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 实现线程等待可以有效地控制多线程的执行顺序和协作,提高代码的可读性和可维护性。