CountDownLatch 类的作用是什么?请解释其工作原理和适用场景。
CountDownLatch 是 Java 并发编程中的一个工具类,它提供了一种等待多线程完成的方式。
CountDownLatch 主要有两个方法,一个是 countDown(),一个是 await()。当我们创建 CountDownLatch 对象时,会给它一个初始的计数值。每当一个线程完成它的任务时,计数值就会减 1,这是通过调用 countDown() 方法实现的。而 await() 方法会阻塞当前线程,直到 CountDownLatch 的计数值减为 0。
所以,CountDownLatch 的主要用途就是让主线程等待其他线程完成它们的任务。当所有其他线程都完成了它们的任务,计数值变为 0,主线程才会继续执行。
这在很多场景中都非常有用。例如,我们可能在主线程中启动了很多子线程,这些子线程需要进行一些复杂的计算。主线程需要等待所有子线程都完成计算,然后再汇总结果。这个时候,我们就可以用 CountDownLatch 来同步这些线程。
下面是一个简单的示例:
CountDownLatch latch = new CountDownLatch(2); // 创建一个计数值为 2 的 CountDownLatch
new Thread(() -> {
System.out.println("子线程1开始执行");
// 执行一些操作...
System.out.println("子线程1执行完成");
latch.countDown(); // 完成后,计数值减 1
}).start();
new Thread(() -> {
System.out.println("子线程2开始执行");
// 执行一些操作...
System.out.println("子线程2执行完成");
latch.countDown(); // 完成后,计数值减 1
}).start();
try {
latch.await(); // 主线程等待所有子线程执行完成
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("所有子线程都执行完成,主线程继续执行...");
在这个示例中,主线程会等待所有子线程执行完成,然后再继续执行。