java 一段代码中有两个线程池 CountDownLatch统计指定线程池数
时间: 2023-08-14 18:05:52 浏览: 49
如果你有两个线程池,并且想要使用 `CountDownLatch` 统计这两个线程池中的线程数量,可以创建两个 `CountDownLatch` 对象,并将计数器的值分别设置为对应线程池的大小。然后,在每个线程池中的任务执行完毕时,调用相应的 `CountDownLatch` 的 `countDown()` 方法来减少计数器的值。最后,通过调用 `await()` 方法等待两个 `CountDownLatch` 的计数器归零。以下是一个示例代码片段,展示了如何实现这一点:
```java
int threadPoolSize1 = 5; // 第一个线程池的大小
int threadPoolSize2 = 3; // 第二个线程池的大小
// 创建两个 CountDownLatch,计数器的值分别设置为两个线程池中线程的数量
CountDownLatch latch1 = new CountDownLatch(threadPoolSize1);
CountDownLatch latch2 = new CountDownLatch(threadPoolSize2);
// 创建第一个线程池
ExecutorService executorService1 = Executors.newFixedThreadPool(threadPoolSize1);
// 提交任务到第一个线程池
for (int i = 0; i < threadPoolSize1; i++) {
executorService1.submit(() -> {
try {
// 执行任务逻辑
} finally {
// 任务执行完毕后,调用 countDown() 方法减少计数器的值
latch1.countDown();
}
});
}
// 创建第二个线程池
ExecutorService executorService2 = Executors.newFixedThreadPool(threadPoolSize2);
// 提交任务到第二个线程池
for (int i = 0; i < threadPoolSize2; i++) {
executorService2.submit(() -> {
try {
// 执行任务逻辑
} finally {
// 任务执行完毕后,调用 countDown() 方法减少计数器的值
latch2.countDown();
}
});
}
try {
// 使用 await() 方法等待两个 CountDownLatch 的计数器归零,即等待两个线程池中的所有线程执行完毕
latch1.await();
latch2.await();
// 在两个线程池中的所有线程执行完毕后,可以进行后续操作
} catch (InterruptedException e) {
// 处理异常
} finally {
// 关闭两个线程池
executorService1.shutdown();
executorService2.shutdown();
}
```
在上述示例中,我们创建了两个 `CountDownLatch` 对象,并将计数器的值分别设置为两个线程池的大小。然后,我们分别创建了两个线程池,并提交了一定数量的任务到每个线程池中。在每个任务执行完毕后,我们调用相应的 `CountDownLatch` 的 `countDown()` 方法减少计数器的值。接下来,我们使用 `await()` 方法等待两个 `CountDownLatch` 的计数器归零,即等待两个线程池中的所有线程执行完毕。在所有线程执行完毕后,我们可以进行后续操作。最后,我们关闭两个线程池。
请注意,每个线程池的计数器值应该与相应线程池中线程的数量保持一致,以确保所有线程都执行完毕时计数器归零。