0.开篇介绍
线程池是并发里面最经常使用的工具类,所以想要晋升为中级Java工程师,学好并发的前提就是学好线程池。这里会介绍关于线程池的一些内容,比如线程池的创建过程和原理,如何理解线程池的各种状态以及之间的转换,理解面试中常说的FixedThreadPool,SingleThreadExecutor,CachedThreadPool,ScheduledThreadPool四种池原理以及使用场景等等,在分析原理的过程中会给出具体的使用实例,尽量能够理解到位。
这是开篇,关于常规线程池ThreadPoolExecutor的创建过程以及各参数含义的介绍。
1.问题引入
Java语言关于线程池的类图:
ThreadPoolExecutor就是我们口中常说的线程池,ScheduledThreadPoolExecutor是继承自它的子类,江湖上称周期线程池,它的作用跟它的名字一样,可以周期性的执行某一个任务。这里我们重点学习ThreadPoolExecutor类,整个过程我们思考以下几个问题:
- 线程池如何创建?
- 线程池如何接收并执行一个或者多个任务?
- 线程池中的线程如何创建?何时创建?存活到何时?
- 线程池中的线程间是如何调度的?即调度机制是什么?
- 线程池如何存放多余任务?
- 线程池如何销毁?何时销毁?
2.ThreadPoolExecutor的4种构造函数以及7个参数介绍
在Java世界里,万物皆对象,所以线程池也抽象成一个ThreadPoolExecutor类,每需要一个线程池就可以new一个ThreadPoolExecutor对象;所以创建线程池也是通过new来实现的。JDK通过重载构造函数提供四种不同形式的构造方法:
// 构造函数A 5个参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
// 构造函数B 6个参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runn