一、为什么要使用线程池?

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; 是否允许核心线程被回收 是否解雇全职员工

三、任务执行过程

四、问题思考

4.1 为什么要用阻塞队列?

4.2 一个线程如何重复执行多个任务?

五、参考资料