线程池的扩容和缩容机制
线程池的主要参数:
corePoolSize(核心线程数):线程池中一直存活的线程数量,即使它们处于空闲状态也不会被销毁。
maximumPoolSize(最大线程数):线程池中允许的最大线程数量,包括空闲状态的线程和正在执行任务的线程。
workQueue(工作队列):存放等待执行的任务的队列。当任务提交到线程池时,会先放入工作队列。
keepAliveTime(线程空闲时间):空闲线程的最大存活时间,超过这个时间空闲线程将被销毁,仅当线程数量超过核心线程数时生效。
RejectedExecutionHandler(任务拒绝处理器):当任务无法被执行时的处理策略。
线程池扩容机制
触发条件
-
新任务提交时核心线程已满且工作队列已满
-
当前线程数 < 最大线程数(maximumPoolSize)
扩容过程
-
检查当前线程数是否小于核心线程数(corePoolSize)
创建新线程(即使有空闲线程) -
核心线程已满时,任务进入工作队列
工作队列已满且线程数 < maximumPoolSize时:
创建新线程处理任务
新线程是非核心线程(可被回收)
线程池缩容机制
触发条件
- 线程空闲时间超过keepAliveTime
- 当前线程数 > corePoolSize
缩容过程
1、工作线程从队列获取任务时:
-
使用poll(keepAliveTime, unit)代替阻塞take()
-
如果在keepAliveTime内未获取到任务,返回null
2、线程退出前会检查:
-
是否需要补充线程(保持不小于corePoolSize)
-
是否需要终止(当前线程数 > corePoolSize)

浙公网安备 33010602011771号