线程-线程池
线程池如何复用?文章目录
前言
在前面的几篇文章中,我们学习了关于线程的一些基础知识,也了解关于线程状态的流转,接下来我们一起学习线程池。
问题思考:
- 线程如何复用?
- 线程如何回收?
一、Worker执行任务模型
主要执行任务的三个角色
Worker-》WorkQueue-》Thread
二、Worker线程如何增加?
涉及参数:
名称 | 含义 |
---|---|
core | 如果为true,则与 corePoolSize 绑定。为false,则与 maximumPoolSize 绑定 |
firstTask | 新线程首先要执行的任务,若没有则传null |
addWorker源码
private boolean addWorker(Runnable firstTask, boolean core) {
retry:
//检测当前线程池状态
for (;;) {
//包含线程池状态和线程中有效线程数量
int c = ctl.get();
//通过高三位获取线程池状态
int rs = runStateOf(c);
// 线程池不处于RUNNABLE状态且现在状态为关系状态,未传入新任务,阻塞队列不为空 返回false
if (rs >= SHUTDOWN &&
! (rs == SHUTDOWN &&
firstTask == null &&
! workQueue.isEmpty()))
return false;
for (;;) {
//通过低29位计算线程池内有效线程的数量
int wc = workerCountOf(c);
//超过size,则返回false
if (wc >= CAPACITY ||
wc >= (core ? corePoolSize : maximumPoolSize))
return false;
//增加工作线程数
if (compareAndIncrementWorkerCount(c))
break retry;
//再次获取线程池状态和线程中有效线程数量
c = ctl.get(); // Re-read ctl
if (runStateOf(c) != rs)
continue retry;
// else CAS failed due to workerCount change; retry inner loop
}
}
boolean workerStarted = false;
boolean workerAdded = false;
Worker w = null;
try {
//创建一个Worker对象,将新任务放入Worker
w = new Worker(firstTask);
//实例化一个线程
final Thread t = w.thread;
if (t != null) {
//加锁
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
// Recheck while holding lock.
// Back out on ThreadFactory failure or if