一、线程池功能
大概可以有分为下面两类功能
- 执行任务
- 取消任务
二、线程池抽象
Java
中对线程池的抽象叫ExecutorService
,继承自Executor
Java
对执行任务
的抽象叫做Executor
三、线程池ThreadPoolExecutor
设计
⚠️⚠️⚠️⚠️为了简化分析,省略了大量的细节⚠️⚠️⚠️⚠️⚠️
首先,线程池要能够调度某个线程去执行任务,那么就需要有一个集合来保存已经创建的线程,称为关于线程的集合
其次,向线程池提交任务,那么线程池可能不会立即执行,那么需要有一个集合来保存已经提交的任务,称为关于任务的集合
然后,线程池要终止某个任务,那么线程池持有的任务,必须具备可以取消的性质,需要一种可以被取消的任务,称为任务
👆三个关键的东西,在ThreadPoolExecutor
中分别对应:
任务
=> Worker
关于任务的集合
=> BlockingQueue<Runnable> workQueue
关于线程的集合
=> HashSet<Worker> workers
可以发现,他们都围绕着Worker
展开
ThreadPoolExecutor.Worker
基本功能解析
Worker
是啥?
Worker
的字段里面包含了一个线程的引用thread
和一个初始任务的引用firstTask
。
为什么要有初始任务呢?
- 你想一个线程被创建出来啥也不干,好像也没必要创建
- 再者,因为线程不只执行一个任务,但是如果它连自己的初始任务都没执行完(
firstTask != null
),哪有空去做其他任务。
Worker
的功能是啥?
- 和
Thread
绑定在一起,然后在Thread
中不断地从任务集合workQueue
里面取出任务执行 - 能够收到线程池的关闭命令,完成终止任务的操作
首先看第一个功能,定位到Worker
的run()
方法
/** Delegates main run loop to outer runWorker. */
public void run() {
runWorker(this);
}
再看runWorker(this)
,传入的是一个Worker
实例。为了简单的理解runWorker()
就是在不断的去任务集合workQueue
里面取出任务执行
final void runWorker