線程池的基本結(jié)構(gòu)
線程池主要線程和一個(gè)阻塞隊(duì)列組成。
線程池的執(zhí)行流程

大體流程
當(dāng)一個(gè)任務(wù)提交到線程池時(shí)
第一步 會(huì)先判斷線程池里的核心線程是否都在執(zhí)行任務(wù);如果有可用線程并且當(dāng)前線程池中的核心線程數(shù)還小于 corePoolSize則創(chuàng)建線程使用,否則就進(jìn)入下一個(gè)流程;
第二步 線程池判斷工作隊(duì)列是否已滿,如果工作隊(duì)列沒(méi)有滿,則將新提交的任務(wù)存儲(chǔ)在這個(gè)工作隊(duì)列里。如果工作隊(duì)列滿了,則進(jìn)入下個(gè)流程;
第三步 判斷線程池里的線程是否都處于工作狀態(tài),如果沒(méi)有,查看一下當(dāng)前線程數(shù)是否到達(dá)maximumPoolSize,如果還未到達(dá),就繼續(xù)創(chuàng)建線程。如果已經(jīng)到達(dá)了,就交給RejectedExecutionHandler來(lái)決定怎么處理這個(gè)任務(wù)。
execute()方法
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
//如果線程數(shù)大于等于基本線程數(shù)或者線程創(chuàng)建失敗,將任務(wù)加入隊(duì)列
if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
//線程池處于運(yùn)行狀態(tài)并且加入隊(duì)列成功
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
//線程池不處于運(yùn)行狀態(tài)或者加入隊(duì)列失敗,則創(chuàng)建線程(創(chuàng)建的是非核心線程)
else if (!addIfUnderMaximumPoolSize(command))
//創(chuàng)建線程失敗,則采取阻塞處理的方式
reject(command); // is shutdown or saturated
}
}
addIfUnderCorePoolSize()
private boolean addIfUnderCorePoolSize(Runnable firstTask) {
Thread t = null;
final ReentrantLock mainLock = this.mainLock;
//阻塞鎖
mainLock.lock();
try {
if (poolSize < corePoolSize && runState == RUNNING)
t = addThread(firstTask);
} finally {
mainLock.unlock();
}
if (t == null)
return false;
//啟動(dòng)線程
t.start();
return true;
}
addThread()方法
private Thread addThread(Runnable firstTask) {
Worker w = new Worker(firstTask);
Thread t = threadFactory.newThread(w);
if (t != null) {
w.thread = t;
workers.add(w);
int nt = ++poolSize;
if (nt > largestPoolSize)
largestPoolSize = nt;
}
return t;
}