一、为什么要使用线程池?
1.1 面临的问题
系统开销大,资源利用率低,无法控制并发数
操作系统实现线程的三种方式:用户线程、内核线程、用户线程+内核线程,java线程与操作系统1-1对应。
反复创建和销毁线程的系统开销比较大,而且还会占用过多的内存资源。
类比开餐馆,每来一个客人,就招聘一个新服务员招待,利用率太低
1.2 解决思路
任何计算机问题,都可以加一层中间层来解决。创建一定数量的线程,反复执行任务,多余的任务则进入队列排队;
- 加快响应速度,服务员时刻准备着,客人可以立刻被安排;
- 集中管理、监控,统筹资源利用率
服务员数量一定,超出的顾客排队等候
二、JDK如何实现?
设计思想:全职员工+临时工,让每个人工作尽可能饱和,人力资源成本要最低。
| 字段定义 | 含义 | 类比 |
|---|---|---|
| volatile ThreadFactory threadFactory; | 线程工厂,新建Thread | |
| volatile int corePoolSize; | 核心线程数 | 全职员工 |
| volatile int maximumPoolSize; | 最大线程数 | 全职员工+临时工总人数 |
| final BlockingQueue workQueue; | 阻塞队列 | 客人排队座位 |
| volatile RejectedExecutionHandler handler; | 拒绝策略 | 客人太多咋办 |
| volatile long keepAliveTime; | 空等回收时间 | 临时工休息太长,自动解雇 |
| volatile boolean allowCoreThreadTimeOut; | 是否允许核心线程被回收 | 是否解雇全职员工 |
