1. 核心原理简述

线程池的核心原理是线程复用。它维护一定数量的工作线程,这些线程循环从任务队列中取出任务并执行,而不是为每个任务都创建一个新线程。这避免了频繁创建和销毁线程带来的系统开销(CPU、内存),同时能控制并发度,防止系统过载。

2. 七大核心参数

ThreadPoolExecutor 的构造函数包含 7 个参数,它们共同决定了线程池的行为:

  1. corePoolSize (核心线程数)
    • 线程池中“常驻”的线程数量。即使空闲,通常也不会被销毁(除非设置了 allowCoreThreadTimeOut)。
  2. maximumPoolSize (最大线程数)
    • 线程池允许创建的最大线程数。当队列满了,且当前线程数小于此值时,会创建非核心线程。
  3. keepAliveTime (空闲存活时间)
    • 当线程数超过 corePoolSize 时,多余的空闲线程在终止前等待新任务的最长时间。
  4. unit (时间单位)
    • keepAliveTime 的单位(如 TimeUnit.SECONDS)。
  5. workQueue (任务队列)
    • 用于存放待执行任务的阻塞队列(如 ArrayBlockingQueue, LinkedBlockingQueue, SynchronousQueue)。
  6. threadFactory (线程工厂)
    • 用于创建新线程。通常用来给线程设置有意义的名字(如 “Order-Thread-1”),方便排查问题。
  7. handler (拒绝策略)
    • 当队列满了且线程数达到 maximumPoolSize 时,对新提交任务的处理策略(如抛异常、丢弃、由调用者执行等)。

3. 工作流程(核心考点)

当提交一个新任务时,线程池的处理流程如下(按顺序判断):

  1. 核心线程判断:如果当前运行的线程数 < corePoolSize,则创建新线程执行任务(即使有空闲线程)。
  2. 队列判断:如果当前运行的线程数 >= corePoolSize,则尝试将任务加入 workQueue
  3. 最大线程判断:如果队列已满,且当前运行的线程数 < maximumPoolSize,则创建非核心线程执行任务。
  4. 拒绝策略:如果队列已满,且当前运行的线程数 >= maximumPoolSize,则执行 handler.rejectedExecution() 拒绝该任务。

4. 总结

回答总结: “线程池通过 7 个参数控制行为。核心流程是:新任务先给核心线程做;核心满了进队列;队列满了开最大线程;最大线程也满了就走拒绝策略。这种机制既保证了核心负载下的响应速度,又有一定的弹性抗压能力,最后还有兜底的保护机制。”