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

Java使用Callable和Future执行任务后程序无法退出的原因排查

问题结论

该问题与Callable、Future无关,是线程池未正确关闭导致的。

原因说明

  • Executors.newFixedThreadPool(2)创建的固定大小线程池,默认持有非守护类型的核心线程,核心线程不会主动销毁,任务执行完成后会长期处于等待新任务的阻塞状态。
  • JVM 正常退出的前提是所有非守护线程全部终止,你的两个计算任务虽然已经执行完毕,future1.isDone()返回true,但线程池的两个核心线程仍处于存活等待状态,因此JVM不会主动退出,表现为程序运行完成后卡住。

修复方法

在所有任务执行完成后,调用线程池的shutdown()方法主动关闭线程池即可:

System.out.println("ret0: " + ret0 + System.lineSeparator() + "ret1: " + ret1);
// 新增此行代码关闭线程池
service.shutdown();

shutdown()会启动线程池关闭流程:不再接收新任务,待所有已提交任务执行完成后销毁所有池内线程,线程全部销毁后JVM即可正常退出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:03