在 Java 的线程池机制中,调用 shutdown 与调用 shutdownNow 这两种关闭方式分别会如何影响线程池里等待队列中的任务以及正在执行的任务?它们的处理流程和最终结果有哪些不同?
考察说明
考查对线程池两种关闭方法的机制理解和差异掌握程度。
回答思路
- 【回答框架 1】shutdown 方法会停止接收新任务,但队列中的任务会继续执行完毕,线程池会进入 SHUTDOWN 状态。其核心是让已提交任务自然完成,不会中断正在运行的任务,适合优雅停机场景。
- 【回答框架 2】shutdownNow 会尝试中断所有正在执行的任务,并返回等待队列中尚未执行的任务列表。其核心是立即停止,通过 Thread.interrupt 中断工作线程,适合需要快速取消的紧急场景。
- 【回答框架 3】两者都不会强制终止线程池中的线程,shutdown 只发信号,shutdownNow 会中断,但中断后的线程是否真正退出取决于任务对中断的响应。若任务不响应中断,shutdownNow 也可能无法立即结束。
- 【回答框架 4】实际选择时,应优先使用 shutdown 保证任务完整性,若需要强中断可先 shutdownNow 获取剩余任务,再配合 awaitTermination 等待线程池真正终止。
- 【关键点 1】shutdown 不再接收新任务,但等待队列任务会继续执行。
- 【关键点 2】shutdownNow 会中断运行中的任务,并返回未执行任务列表。
- 【关键点 3】两者都不保证线程池立即终止,最终终止依赖任务对中断的响应。
- 【易错点 1】误以为 shutdownNow 能强制杀死线程,实际它只是发起中断,任务可忽略中断导致无法终止。
- 【易错点 2】忽略两个方法都不等待线程池真正结束,需要配合 awaitTermination 使用。
- 【易错点 3】混淆了 shutdown 后提交任务会抛 RejectedExecutionException,shutdownNow 后队列任务被清空并返回。