面试题答案
一键面试SHUTDOWN状态下新任务处理逻辑
当Java线程池处于SHUTDOWN状态时,新提交的任务会被拒绝。具体过程如下:
- 线程池不再接受新任务,但会继续执行已提交到阻塞队列中的任务。
- 当调用
execute(Runnable task)
方法提交新任务时,线程池首先会检查线程池状态。因为此时处于SHUTDOWN状态,线程池会直接调用拒绝策略,默认的拒绝策略是AbortPolicy
,即抛出RejectedExecutionException
异常,告知调用者任务提交失败。
与其他状态下处理新任务的区别
- RUNNING状态:线程池处于正常运行状态,新提交的任务会被线程池接受并处理。如果当前运行的线程数小于核心线程数,会创建新线程来执行任务;如果当前运行的线程数达到核心线程数,任务会被放入阻塞队列中等待执行;如果阻塞队列已满且当前运行的线程数小于最大线程数,会创建新的非核心线程来执行任务;如果阻塞队列已满且当前运行的线程数达到最大线程数,才会调用拒绝策略。
- STOP状态:线程池不仅不再接受新任务,还会中断正在执行的任务并且清空阻塞队列,新提交的任务同样会被拒绝(调用拒绝策略),但此时线程池已不再执行任何任务。
- TIDYING状态:该状态下所有任务都已终止,线程池正在准备进入
TERMINATED
状态,此时也不再接受新任务,新任务同样被拒绝。 - TERMINATED状态:线程池彻底终止,新任务提交同样会被拒绝,并且整个线程池生命周期结束。