You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Executor执行完毕后如何结束主程序?主线程无法终止问题求助

主线程无法终止?大概率是ExecutorService没关闭!

兄弟,我太懂你这种明明静态变量都拿到正确结果了,但程序还赖着不结束的糟心感!你猜的没错,问题就是出在ExecutorService没终止上——默认的线程池里的线程都是非守护线程,哪怕你的任务看似执行完了,这些线程还会一直等着接新任务,导致JVM没法正常退出。

为啥之前用自定义Runnable没这问题?因为你直接new Thread(new YourRunnable()).start()的话,线程跑完run方法就直接终止了,不会占着资源不放。但线程池是为了复用线程设计的,它的工作线程会一直存活,直到你明确告诉它“我没任务给你了,你可以歇着了”。

给你几个解决步骤,亲测好用:

  • 第一步:任务提交完立刻调用shutdown()
    这个方法会告诉线程池“不要再接受新任务了,等当前所有正在执行和排队的任务都做完就关闭”。

  • 第二步:等待任务全部完成(可选但建议)
    如果你想让主线程等所有任务都执行完再继续,就用awaitTermination()设置一个超时时间,确保任务都能完成。如果超时还没完成,就强制关闭线程池。

举个实际代码例子,你可以照着改:

// 假设你是这么创建线程池的
ExecutorService executor = Executors.newFixedThreadPool(3);

// 提交你的任务们
executor.submit(new YourCustomRunnable());
executor.submit(new YourCustomRunnable());

// 关键操作:先关闭线程池,拒绝新任务
executor.shutdown();

try {
    // 等待所有任务完成,最多等15秒(时间你自己调)
    if (!executor.awaitTermination(15, TimeUnit.SECONDS)) {
        // 超时了还没做完?强制关闭,打断正在执行的任务
        executor.shutdownNow();
    }
} catch (InterruptedException e) {
    // 主线程被中断了?也强制关闭线程池
    executor.shutdownNow();
    // 恢复中断状态
    Thread.currentThread().interrupt();
}

这样一来,线程池会在所有任务完成后关闭工作线程,JVM就能正常终止,主线程也不会一直卡着啦!

内容的提问来源于stack exchange,提问作者Vladyslav Lopatin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:47:57