面试题答案
一键面试- 线程池状态
- RUNNING:线程池处于正常运行状态,能够接受新任务并处理队列中的任务。
- SHUTDOWN:线程池不再接受新任务,但会继续处理队列中已有的任务。
- STOP:线程池不再接受新任务,并且会中断正在执行的任务,同时清空任务队列。
- TIDYING:所有任务都已终止,工作线程数为0,即将进入
TERMINATED
状态。 - TERMINATED:线程池已完全终止。
- 任务提交处理流程
- 当调用
ThreadPoolExecutor
的execute(Runnable task)
方法提交任务时:- 步骤1:判断线程池状态
- 如果线程池状态不是
RUNNING
,任务将被拒绝(根据拒绝策略处理,如抛出异常、将任务回退到调用者等)。
- 如果线程池状态不是
- 步骤2:判断工作线程数
- 如果当前工作线程数小于核心线程数(
corePoolSize
),则创建一个新的工作线程来执行该任务。
- 如果当前工作线程数小于核心线程数(
- 步骤3:判断任务队列
- 如果当前工作线程数大于或等于核心线程数,且任务队列(
workQueue
)未满,则将任务添加到任务队列中等待执行。
- 如果当前工作线程数大于或等于核心线程数,且任务队列(
- 步骤4:判断线程池是否已满
- 如果当前工作线程数大于或等于核心线程数,且任务队列已满,同时工作线程数小于最大线程数(
maximumPoolSize
),则创建一个新的非核心工作线程来执行该任务。
- 如果当前工作线程数大于或等于核心线程数,且任务队列已满,同时工作线程数小于最大线程数(
- 步骤5:拒绝任务
- 如果当前工作线程数大于或等于核心线程数,任务队列已满,且工作线程数达到最大线程数,那么根据设置的拒绝策略来处理该任务。常见的拒绝策略有:
- AbortPolicy:直接抛出
RejectedExecutionException
异常。 - CallerRunsPolicy:将任务回退给调用者,由调用者线程来执行该任务。
- DiscardPolicy:直接丢弃该任务,不做任何处理。
- DiscardOldestPolicy:丢弃任务队列中最老的任务,然后尝试将新任务添加到任务队列。
- AbortPolicy:直接抛出
- 如果当前工作线程数大于或等于核心线程数,任务队列已满,且工作线程数达到最大线程数,那么根据设置的拒绝策略来处理该任务。常见的拒绝策略有:
- 步骤1:判断线程池状态
- 当调用
- 不同线程池状态下任务的处理
- RUNNING状态:正常按照上述步骤1 - 5处理任务。
- SHUTDOWN状态:不接受新任务,步骤1中任务被拒绝。但会继续处理任务队列中的任务,直到队列为空,并且所有工作线程执行完任务后终止。
- STOP状态:不接受新任务,步骤1中任务被拒绝。正在执行的任务会被中断,任务队列会被清空,所有工作线程会被中断。
- TIDYING状态:不接受新任务,任务被拒绝。此时所有任务已完成,等待进入
TERMINATED
状态。 - TERMINATED状态:不接受新任务,任务被拒绝。线程池已完全终止,所有资源已释放。