MST
星途 面试题库

面试题:Java线程池停止过程中任务的处理机制是怎样的?

当调用 `shutdown()` 或 `shutdownNow()` 方法后,线程池中的任务会经历哪些状态变化和处理流程?假设线程池中存在正在执行的任务和等待队列中的任务,详细阐述这些任务在停止过程中的具体处理方式,以及如何通过 `Future` 接口来管理任务的中断和结果获取。
24.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. shutdown() 方法

  • 状态变化:线程池状态从 RUNNING 变为 SHUTDOWN
  • 正在执行的任务:会继续执行直到完成。
  • 等待队列中的任务:不再接受新任务,但队列中已有的任务不会被处理,会保持在队列中。

2. shutdownNow() 方法

  • 状态变化:线程池状态从 RUNNING 变为 STOP
  • 正在执行的任务:调用 Thread.interrupt() 尝试中断正在执行的任务。
  • 等待队列中的任务:会被清空,这些任务会以 List<Runnable> 的形式返回,并且这些任务对应的线程也会被尝试中断。

3. 通过 Future 接口管理任务的中断和结果获取

  • 中断任务:若使用 submit 方法提交任务会返回 Future 对象,调用 Future.cancel(true) 可以中断任务,若任务正在执行,会尝试调用 Thread.interrupt() 进行中断。
  • 获取结果:调用 Future.get() 方法获取任务执行结果,如果任务还未完成,此方法会阻塞直到任务完成;若任务被中断,get 方法会抛出 InterruptedException,若任务执行异常,会抛出 ExecutionException