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