public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
)
corePoolSize(核心线程数)
线程池中长期存活的线程数量
即使空闲,也不会被销毁(除非设置允许回收)
作用:保证线程池的基本处理能力
maximumPoolSize(最大线程数)
线程池中允许存在的最大线程数量
当任务很多、队列已满时,才会创建新线程
作用:限制线程数量,防止资源耗尽
keepAliveTime(空闲存活时间)
非核心线程空闲时,最多存活时间
超过该时间将被回收
unit(时间单位)
keepAliveTime 的时间单位
如:TimeUnit.SECONDS
workQueue(任务队列)
用于存放等待执行的任务
常见实现:
队列
特点
LinkedBlockingQueue
无界队列(可能 OOM)
ArrayBlockingQueue
有界队列
SynchronousQueue
不存任务,直接交给线程
DelayQueue
延时任务
threadFactory(线程工厂)
用于创建线程
可自定义线程名、优先级、是否守护线程
方便排查问题、日志定位
handler(拒绝策略)
当线程池线程数已满 + 队列已满时触发。
策略
行为
AbortPolicy
抛异常(默认)
CallerRunsPolicy
调用者自己执行
DiscardPolicy
直接丢弃任务
DiscardOldestPolicy
丢弃最早任务
线程池的工作流程
线程池处理任务的完整逻辑可总结为5个步骤:
flowchart TD A[提交任务] --> B{核心线程池是否满?} B -- 否 --> C[创建核心线程执行任务] B -- 是 --> D{任务队列是否满?} D -- 否 --> E[任务加入队列等待] D -- 是 --> F{线程池是否达到最大线程数?} F -- 否 --> G[创建非核心线程执行任务] F -- 是 --> H[执行拒绝策略]
Executors创建常见线程池
Java提供了Executors工具类,快速创建线程池(但生产环境不推荐直接使用)。
FixedThreadPool(固定大小线程池)
java复制代码
ExecutorService pool = Executors.newFixedThreadPool(5);
特点
线程数量固定
使用 无界队列 LinkedBlockingQueue
风险
任务过多可能 OOM(内存溢出)
适用场景
任务量稳定
并发数可控
SingleThreadExecutor(单线程池)
java复制代码
ExecutorService pool = Executors.newSingleThreadExecutor();
特点
只有一个线程
保证任务顺序执行
风险
任务堆积可能 OOM(内存溢出)
CachedThreadPool(缓存线程池)
java复制代码
ExecutorService pool = Executors.newCachedThreadPool();
特点
线程数不固定
空闲线程 60s 回收
使用 SynchronousQueue
风险
线程数无限增长,容易耗尽CPU
ScheduledThreadPool(定时线程池)
java复制代码
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);