终止dedicatedExecutorService后doHeavyWork是否终止且logExecutionError必执行?
终止线程池时运行中的任务是否会被杀死
取决于你调用的线程池终止方法,以及重负载任务本身是否响应中断:
- 调用
shutdown()方法:仅停止接收新任务,已提交的所有任务(正在运行、队列中等待的)都会执行完毕,不会终止正在运行的任务。 - 调用
shutdownNow()方法:会尝试终止所有正在运行的任务,清空等待队列并返回未执行的任务列表。该方法本质是给所有工作线程发送interrupt中断信号:- 若
doHeavyWork逻辑存在响应中断的代码(例如调用sleep/wait/阻塞IO等会抛出InterruptedException的方法,或主动检查Thread.currentThread().isInterrupted()并主动退出执行),任务会被终止。 - 若
doHeavyWork是纯计算逻辑,完全不响应中断信号,任务会一直执行到结束,不会被杀死。
- 若
logExecutionError是否能保证被执行
不能100%保证,和执行场景有关,且逻辑和你最初的同步try-catch逻辑一致:仅当链路出现异常时才会触发该方法:
- 调用
shutdown()终止线程池:所有已提交任务都会正常执行,仅当任务执行抛出业务异常时才会触发logExecutionError。 - 调用
shutdownNow()终止线程池:- 任务还在队列中未开始执行:任务会被取消,对应的
CompletableFuture会以CancellationException异常完成,触发logExecutionError。 - 任务正在运行且响应中断:中断触发的
InterruptedException会向上传递到异步链路,触发logExecutionError。 - 任务正在运行且不响应中断:任务会正常跑完,仅当业务逻辑抛出异常时才会触发
logExecutionError。
- 任务还在队列中未开始执行:任务会被取消,对应的
- 极端场景如JVM被强制杀死、机器断电等情况,
logExecutionError必然无法执行。
额外建议
如果需要确保超时任务可以被及时终止,建议在doHeavyWork的核心逻辑中加入中断状态检查,收到中断信号时主动退出任务,避免资源浪费。
内容的提问来源于stack exchange,提问作者qnhant5010
相关产品推荐
相关产品推荐

