我需要创建一个 容量为 10 的线程池,然后向这个线程池提交 100 个任务(或线程) 去执行。
主程序必须 在所有 100 个任务都执行完毕后,才能得到通知或继续执行后续逻辑。
我知道在委托里可以用 BeginInvoke返回的 IAsyncResult对象的 IsCompleted属性来判断单个异步调用是否完成,但 线程池(ThreadPool)本身没有直接提供这种“等待所有任务完成”的便捷方法。
网上很多资料提到用 ThreadPool.RegisterWaitForSingleObject注册一个句柄,通过判断线程池的 可工作线程数 和 最大线程数 来决定何时注销这个句柄,但我不太明白这个方法应该用在什么地方,甚至有人建议再开一个 子线程 来轮询判断线程池状态。
我想知道:到底应该怎样简洁可靠地实现“等待线程池中所有任务完成”这个目标?
如何判断线程池里的线程全部执行完毕
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
4条回答 默认 最新
阿里嘎多学长 2025-12-09 17:30关注阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
解决方案
你可以使用
ThreadPoolExecutor的awaitTermination方法来判断线程池里的线程全部执行完毕。这个方法会阻塞直到线程池里的线程全部执行完毕或者超时。import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) throws InterruptedException { // 创建一个容量为 10 的线程池 ExecutorService executor = Executors.newFixedThreadPool(10); // 提交 100 个任务 for (int i = 0; i < 100; i++) { executor.submit(() -> { // 任务执行逻辑 System.out.println("任务执行中..."); }); } // 等待线程池里的线程全部执行完毕 executor.shutdown(); executor.awaitTermination(1, TimeUnit.DAYS); // 等待 1 天 // 如果线程池里的线程全部执行完毕,awaitTermination方法会返回true if (executor.isTerminated()) { System.out.println("所有任务执行完毕"); } else { System.out.println("有任务未执行完毕"); } } }在上面的代码中,我们使用
awaitTermination方法来等待线程池里的线程全部执行完毕。这个方法会阻塞直到线程池里的线程全部执行完毕或者超时。如果线程池里的线程全部执行完毕,awaitTermination方法会返回true,否则会返回false。解决 无用评论 打赏 举报