1. 核心原理简述
线程池的核心原理是线程复用。它维护一定数量的工作线程,这些线程循环从任务队列中取出任务并执行,而不是为每个任务都创建一个新线程。这避免了频繁创建和销毁线程带来的系统开销(CPU、内存),同时能控制并发度,防止系统过载。
2. 七大核心参数
ThreadPoolExecutor 的构造函数包含 7 个参数,它们共同决定了线程池的行为:
corePoolSize(核心线程数):- 线程池中“常驻”的线程数量。即使空闲,通常也不会被销毁(除非设置了
allowCoreThreadTimeOut)。
- 线程池中“常驻”的线程数量。即使空闲,通常也不会被销毁(除非设置了
maximumPoolSize(最大线程数):- 线程池允许创建的最大线程数。当队列满了,且当前线程数小于此值时,会创建非核心线程。
keepAliveTime(空闲存活时间):- 当线程数超过
corePoolSize时,多余的空闲线程在终止前等待新任务的最长时间。
- 当线程数超过
unit(时间单位):keepAliveTime的单位(如TimeUnit.SECONDS)。
workQueue(任务队列):- 用于存放待执行任务的阻塞队列(如
ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue)。
- 用于存放待执行任务的阻塞队列(如
threadFactory(线程工厂):- 用于创建新线程。通常用来给线程设置有意义的名字(如 “Order-Thread-1”),方便排查问题。
handler(拒绝策略):- 当队列满了且线程数达到
maximumPoolSize时,对新提交任务的处理策略(如抛异常、丢弃、由调用者执行等)。
- 当队列满了且线程数达到
3. 工作流程(核心考点)
当提交一个新任务时,线程池的处理流程如下(按顺序判断):
- 核心线程判断:如果当前运行的线程数 <
corePoolSize,则创建新线程执行任务(即使有空闲线程)。 - 队列判断:如果当前运行的线程数 >=
corePoolSize,则尝试将任务加入workQueue。 - 最大线程判断:如果队列已满,且当前运行的线程数 <
maximumPoolSize,则创建非核心线程执行任务。 - 拒绝策略:如果队列已满,且当前运行的线程数 >=
maximumPoolSize,则执行handler.rejectedExecution()拒绝该任务。
4. 总结
回答总结: “线程池通过 7 个参数控制行为。核心流程是:新任务先给核心线程做;核心满了进队列;队列满了开最大线程;最大线程也满了就走拒绝策略。这种机制既保证了核心负载下的响应速度,又有一定的弹性抗压能力,最后还有兜底的保护机制。”