w2265718344 2025-12-09 17:24 采纳率: 25%
浏览 7

如何判断线程池里的线程全部执行完毕

我需要创建一个 容量为 10 的线程池,然后向这个线程池提交 100 个任务(或线程)​ 去执行。
主程序必须 在所有 100 个任务都执行完毕后,才能得到通知或继续执行后续逻辑。
我知道在委托里可以用 BeginInvoke返回的 IAsyncResult对象的 IsCompleted属性来判断单个异步调用是否完成,但 线程池(ThreadPool)本身没有直接提供这种“等待所有任务完成”的便捷方法。
网上很多资料提到用 ThreadPool.RegisterWaitForSingleObject注册一个句柄,通过判断线程池的 可工作线程数​ 和 最大线程数​ 来决定何时注销这个句柄,但我不太明白这个方法应该用在什么地方,甚至有人建议再开一个 子线程​ 来轮询判断线程池状态。
我想知道:到底应该怎样简洁可靠地实现“等待线程池中所有任务完成”这个目标?

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-12-09 17:30
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    你可以使用 ThreadPoolExecutorawaitTermination 方法来判断线程池里的线程全部执行完毕。这个方法会阻塞直到线程池里的线程全部执行完毕或者超时。

    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

    评论

报告相同问题?

问题事件

  • 创建了问题 12月9日