说明:本文是我对自己学习知识的一个简单总结,可能存在许多不足,我希望通过此方式来回顾知识,加强理解,也希望大家能指出文中的错误与不足,互相学习,谢谢。
1.什么是线程池
线程池顾名思义是一个线程缓存的‘池子’。线程是稀缺资源,线程如果创建的太多,会消耗系统的资源,还会降低系统的稳定性,所以java中通过线程池来统一管理分配线程这个稀缺的资源,达到资源重复利用。
2.线程池的出现
在web系统中,服务器需要接受大量的并发请求,一个请求就会对应一个线程,如果并发的请求很多,但每个线程执行的时间很短,这样系统就会频繁的创建和销毁线程,系统的性能就会受到影响。那么是否存在一种方式,线程执行任务后并不销毁,而是重复利用?这就是线程池出现的目的。
3.Executor框架
Executor框架是线程池的基础接口,里面定义了一个execute()方法,如下:
void execute(Runnable command);
从方法中看出,execute方法参数是Runnable接口的实现,而Runnable接口是线程实现的接口,所有execute执行的是一个线程任务。
4.ThreadPoolExecutor
ThreadPoolExecutor是线程池实现的关键类,接下来我们分析下线程池的具体实现。
//ctl存储的是线程运行的状态和线程池内有效的线程数量。前3位代表运行状态,后29位
//代表线程数量
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
// 这里是线程池中的5种状态
// 运行状态
private static final int RUNNING = -1 << COUNT_BITS;//111
// 线程池处于该状态时不再接受新任务,但可以继续处理已添加的任务
private static final int SHUTDOWN = 0 << COUNT_BITS;//000
// 线程池处于该状态时不再接受新任务,也不继续执行已添加任务
private static final int STOP = 1 << COUNT_BITS;//001
// 线程池处于该状态时,所有任务已终止,ctl任务数量为0
private static final int TIDYING = 2 << COUNT_BITS;//010
// 线程池彻底终止
private static final int TERMINATED = 3 << COUNT_BITS;//011
// 得到运行状态
private static int runStateOf(int c) { return c & ~CAPACITY; }
// 得到线程工作数量
private static int workerCountOf(int c) { return c & CAPACITY; }
private static int ctlOf(int rs, int wc) { return rs | wc; }
4.1线程池创建
- 线程池ThreadPoolExecutor构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
接下来对这些参数做简单说明:
- corePoolSize: 线程池中的核心线程数
- maximumPoolSize: 线程池中允许的最大线程数
- keepAliveTime: 当线程池中的线程数量大于corePool