编写一个示例程序,展示如何使用 CountDownLatch 类进行多线程同步和协作。
给出一个简单的 CountDownLatch 的使用示例,假设我们有一个应用场景:主线程需要等待两个子线程都完成工作后再继续执行。
这是一个简单的代码示例:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
// 创建一个 CountDownLatch 实例,初始计数为 2
CountDownLatch latch = new CountDownLatch(2);
// 创建并启动第一个子线程
new Thread(() -> {
try {
Thread.sleep(1000); // 模拟耗时操作
System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); // 计数减 1
}
}).start();
// 创建并启动第二个子线程
new Thread(() -> {
try {
Thread.sleep(2000); // 模拟耗时操作
System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); // 计数减 1
}
}).start();
System.out.println("等待两个子线程执行完毕...");
latch.await(); // 等待 latch 计数减为 0
System.out.println("两个子线程都已经执行完毕");
System.out.println("继续主线程执行...");
}
}
在这个示例中,主线程创建了一个初始计数为 2 的 CountDownLatch。然后创建了两个子线程,每个子线程完成工作后会将 CountDownLatch 的计数减 1。主线程调用 latch.await(),等待 CountDownLatch 的计数减为 0,然后继续执行。