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
相关产品推荐
相关产品推荐

