Skip to content

线程池核心参数与执行原理

一、ThreadPoolExecutor七大核心参数

构造方法:

java
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  1. corePoolSize 核心线程数 常驻存活的线程,不会被超时回收,空闲时也保留在线程池。
  2. maximumPoolSize 最大线程总数 核心线程 + 临时急救线程的上限,线程池最多拥有的工作线程数量。
  3. keepAliveTime 空闲存活时间 仅作用于临时急救线程;空闲超过该时长,临时线程会被销毁释放。
  4. unit 时间单位 配合keepAliveTime,指定时分秒毫秒等时间单位。
  5. workQueue 阻塞任务队列 核心线程全部繁忙时,新任务进入队列排队;队列填满后才会创建临时线程。
  6. threadFactory 线程工厂 自定义线程创建逻辑:线程名称、是否守护线程、优先级等。
  7. handler 拒绝策略 核心线程、队列、临时线程全部打满,新任务触发拒绝策略。

二、线程池任务执行完整流程

  1. 提交新任务,判断核心线程是否未满
    • 未满:新建核心线程执行任务;
    • 已满:进入下一步。
  2. 判断阻塞队列是否未满
    • 未满:任务存入队列排队;
    • 已满:进入下一步。
  3. 判断当前总线程数是否小于maximumPoolSize
    • 小于:创建临时急救线程执行任务;
    • 等于最大值:触发拒绝策略。
  4. 线程空闲回收规则 临时线程执行完任务,空闲达到keepAliveTime就销毁;核心线程永久保留。
  5. 线程复用规则 线程执行完毕后,循环从阻塞队列取出排队任务继续执行,实现线程复用。

三、四种内置拒绝策略

  1. AbortPolicy(默认) 直接抛出RejectedExecutionException异常,中断任务提交。
  2. CallerRunsPolicy 不抛弃、不抛异常,由提交任务的调用者线程执行当前任务。
  3. DiscardOldestPolicy 丢弃阻塞队列队首最老的未执行任务,将当前新任务入队。
  4. DiscardPolicy 静默丢弃当前新任务,无日志、无异常。

四、面试高频问答

  1. 问:线程池七大参数分别是什么?答: 核心线程数、最大线程数、临时线程空闲时长、时间单位、阻塞队列、线程工厂、拒绝策略。
  2. 问:提交任务时线程池完整执行流程?答: 先看核心线程是否有空;无空闲则放入阻塞队列;队列满则创建临时线程;线程达到最大值后执行拒绝策略。
  3. 问:keepAliveTime只对哪种线程生效?答: 仅临时急救线程,核心线程不会因为空闲超时销毁。
  4. 问:四种拒绝策略区别?答: Abort抛异常;CallerRuns交给调用线程执行;DiscardOldest丢弃队列最旧任务;Discard直接丢掉新任务。

Powered by VitePress 1.6.4 | 持续更新中