主题切换
线程池核心参数与执行原理
一、ThreadPoolExecutor七大核心参数
构造方法:
java
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)- corePoolSize 核心线程数 常驻存活的线程,不会被超时回收,空闲时也保留在线程池。
- maximumPoolSize 最大线程总数 核心线程 + 临时急救线程的上限,线程池最多拥有的工作线程数量。
- keepAliveTime 空闲存活时间 仅作用于临时急救线程;空闲超过该时长,临时线程会被销毁释放。
- unit 时间单位 配合keepAliveTime,指定时分秒毫秒等时间单位。
- workQueue 阻塞任务队列 核心线程全部繁忙时,新任务进入队列排队;队列填满后才会创建临时线程。
- threadFactory 线程工厂 自定义线程创建逻辑:线程名称、是否守护线程、优先级等。
- handler 拒绝策略 核心线程、队列、临时线程全部打满,新任务触发拒绝策略。
二、线程池任务执行完整流程
- 提交新任务,判断核心线程是否未满
- 未满:新建核心线程执行任务;
- 已满:进入下一步。
- 判断阻塞队列是否未满
- 未满:任务存入队列排队;
- 已满:进入下一步。
- 判断当前总线程数是否小于maximumPoolSize
- 小于:创建临时急救线程执行任务;
- 等于最大值:触发拒绝策略。
- 线程空闲回收规则 临时线程执行完任务,空闲达到keepAliveTime就销毁;核心线程永久保留。
- 线程复用规则 线程执行完毕后,循环从阻塞队列取出排队任务继续执行,实现线程复用。
三、四种内置拒绝策略
- AbortPolicy(默认) 直接抛出RejectedExecutionException异常,中断任务提交。
- CallerRunsPolicy 不抛弃、不抛异常,由提交任务的调用者线程执行当前任务。
- DiscardOldestPolicy 丢弃阻塞队列队首最老的未执行任务,将当前新任务入队。
- DiscardPolicy 静默丢弃当前新任务,无日志、无异常。
四、面试高频问答
- 问:线程池七大参数分别是什么?答: 核心线程数、最大线程数、临时线程空闲时长、时间单位、阻塞队列、线程工厂、拒绝策略。
- 问:提交任务时线程池完整执行流程?答: 先看核心线程是否有空;无空闲则放入阻塞队列;队列满则创建临时线程;线程达到最大值后执行拒绝策略。
- 问:keepAliveTime只对哪种线程生效?答: 仅临时急救线程,核心线程不会因为空闲超时销毁。
- 问:四种拒绝策略区别?答: Abort抛异常;CallerRuns交给调用线程执行;DiscardOldest丢弃队列最旧任务;Discard直接丢掉新任务。