线程池
老葛曾讲过: 2025.7.1
现在再次加强,线程池这一概念 2025.8.23
线程池 七大参数
| 参数 | 作用 | 规则 | 类比 |
|---|---|---|---|
corePoolSize |
核心线程数 | ≥0 | 餐厅正式员工 |
maximumPoolSize |
最大线程数 | ≥核心线程数 | 餐厅最大容纳人数 |
keepAliveTime |
空闲线程存活时间 | ≥0(配合unit使用) |
临时工解雇等待时间 |
unit |
空闲时间单位 | TimeUnit枚举 |
时间单位(秒/分钟) |
workQueue |
阻塞队列 | 不能为null |
顾客等候区 |
threadFactory |
线程创建工厂 | 不能为null |
HR招聘流程 |
handler |
拒绝策略 | 不能为null |
客满时的应对方案 |
执行流程
flowchart LR
A([提交任务]) --> B{核心线程是否满}
B --未满--> C[使用核心线程执行]
B --已满--> D{队列是否满}
D --未满--> E[任务入队等待]
D --已满--> F{最大线程是否满}
F --未满--> G([创建临时线程执行])
F --已满--> H([触发拒绝策略])
拒绝策略
| 策略名称 | 行为描述 | 特点 |
|---|---|---|
AbortPolicy |
丢弃任务, 抛出 RejectedExecutionException 异常 |
默认策略,强制中断流程 |
DiscardPolicy |
直接静默丢弃新提交的任务 | 无任何通知 |
DiscardOldestPolicy |
丢弃队列中最旧的任务,重试提交新任务 | 可能丢失等待时间最长的任务 |
CallerRunsPolicy |
将任务退回给调用者线程执行 | 降低新任务提交速度 |
线程工厂
JDK提供的线程工厂,存在一些潜在风险,体现在资源控制不当可能导致的系统问题。
具体分析如下:
// 阻塞队列为Integer.MAX_VALUE
Executors.newFixedThreadPool(100);
Executors.newSingleThreadExecutor();
// 最大线程数为Integer.MAX_VALUE
Executors.newCachedThreadPool(new ThreadPoolTaskExecutor().getThreadPoolExecutor().getThreadFactory());
Executors.newScheduledThreadPool(1);
所以实际开发环境中我们都是手动创建并且显式配置核心参数✌。
