MST
星途 面试题库

面试题:Java线程池关闭过程中如何处理正在执行和等待队列中的任务

当对Java线程池执行关闭操作时,描述线程池是怎样分别处理正在执行的任务以及等待队列中的任务的,并且说明不同关闭方法(如shutdown() 和 shutdownNow())对这两类任务处理方式的差异及原因。
27.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 线程池关闭时对正在执行任务和等待队列任务的处理

  • 正在执行的任务
    • 当执行关闭操作后,正在执行的任务会继续执行直到完成。
  • 等待队列中的任务
    • 不再接受新的任务进入等待队列。

2. shutdown()shutdownNow() 的差异

  • shutdown()
    • 对正在执行任务的处理:允许正在执行的任务继续执行完成。
    • 对等待队列任务的处理:等待队列中未执行的任务不会再启动执行,但是会保留在队列中直到线程池完全终止。
    • 原因shutdown() 旨在实现平缓关闭,即不希望中断正在执行的任务,给它们一个自然结束的机会,同时也不接受新任务,逐步清空任务队列。
  • shutdownNow()
    • 对正在执行任务的处理:尝试停止所有正在执行的任务,通过调用线程的 interrupt() 方法来实现。如果任务对中断有响应(例如在合适的地方检查 Thread.currentThread().isInterrupted() 并进行相应处理),则任务会停止执行。但有些任务可能忽略中断信号,继续执行。
    • 对等待队列任务的处理:会将等待队列中的任务全部移除,并以列表的形式返回,这些任务不会再执行。
    • 原因shutdownNow() 更倾向于立即终止线程池,尽快释放资源,所以会中断正在执行的任务并清除等待队列中的任务。