Java等待异步线程池跑完再执行指定方法的三种方式(condition、CountDownLatch、CyclicBarrier)
这里提供的解决方案是使用Java并发库中的CountDownLatch
类。这是一个同步工具类,可以使一个或多个线程等待一系列指定数量的操作完成。
以下是使用CountDownLatch
的示例代码:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(10);
CountDownLatch latch = new CountDownLatch(10); // 设置计数器为10
for (int i = 0; i < 10; i++) {
int taskId = i;
executor.submit(() -> {
try {
System.out.println("Task " + taskId + " is running.");
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown(); // 每个任务完成时减少计数
}
});
}
latch.await(); // 等待所有任务完成
System.out.println("All tasks are completed. Method can be invoked now.");
executor.shutdown(); // 关闭线程池
}
}
在这个例子中,我们创建了一个有10个线程的线程池。使用CountDownLatch
的实例latch
来跟踪还有多少个线程任务正在执行。每当一个任务完成时,它就会调用countDown
方法,这就减少计数。主线程调用latch.await()
方法等待计数器变为0,也就是等待所有线程任务完成。当所有任务完成后,主线程继续执行,并关闭线程池。
评论已关闭