有人可以帮助我了解 Java CountDownLatch
是什么以及何时使用它吗?
我不太清楚这个程序是如何工作的。据我了解,所有三个线程同时启动,每个线程将在 3000 毫秒后调用 CountDownLatch。所以倒计时会一个一个递减。闩锁变为零后,程序打印“已完成”。可能我理解的方式不正确。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Processor implements Runnable {
private CountDownLatch latch;
public Processor(CountDownLatch latch) {
this.latch = latch;
}
public void run() {
System.out.println("Started.");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
}
// ---------------------------------------------- ——
public class App {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(3); // coundown from 3 to 0
ExecutorService executor = Executors.newFixedThreadPool(3); // 3 Threads in pool
for(int i=0; i < 3; i++) {
executor.submit(new Processor(latch)); // ref to latch. each time call new Processes latch will count down by 1
}
try {
latch.await(); // wait until latch counted down to 0
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Completed.");
}
}
原文由 amal 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,你没看错。
CountDownLatch
以闩锁原理工作,主线程将等待直到门打开。一个线程等待创建CountDownLatch
时指定的 n 个 线程。任何调用
CountDownLatch.await()
的线程,通常是应用程序的主线程,将等待计数达到零或被另一个线程中断。一旦完成或准备好,所有其他线程都需要通过调用CountDownLatch.countDown()
进行倒计时。一旦计数达到零,等待线程就会继续。
CountDownLatch
的缺点/优点之一是它不可重复使用:一旦计数达到零,你就不能再使用CountDownLatch
了。编辑:
使用
CountDownLatch
当一个线程(如主线程)需要等待一个或多个线程完成,然后才能继续处理。在 Java 中使用
CountDownLatch
的一个经典示例是使用服务架构的服务器端核心 Java 应用程序,其中多个服务由多个线程提供,并且在所有服务都成功启动之前应用程序无法开始处理。PS OP 的问题有一个非常简单的例子,所以我没有包括一个。