worker線程
線程池的每一個(gè)線程其實(shí)就是一個(gè)封裝好的worker。
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
{
//worker繼承了runnable,但是這個(gè)thread是真正執(zhí)行任務(wù)的
final Thread thread;
//當(dāng)firstTask不為空時(shí)則代表的是核心線程的創(chuàng)建
Runnable firstTask;
/** Per-thread task counter */
volatile long completedTasks;
//執(zhí)行任務(wù)
public void run() {
runWorker(this);
}
}
Worker又繼承了AQS彬祖,通過(guò)鎖來(lái)保證線程安全
1.lock方法一旦獲取了獨(dú)占鎖,表示當(dāng)前線程正在執(zhí)行任務(wù)中。
2.如果正在執(zhí)行任務(wù)借笙,則不能中斷線程。
3.如果該線程現(xiàn)在是空閑的狀態(tài)较锡,這時(shí)可以對(duì)該線程進(jìn)行中斷业稼。
4.線程池在執(zhí)行shutdown方法之后會(huì)調(diào)用interruptIdleWorkers方法來(lái)中斷空閑的線程,進(jìn)行回收蚂蕴。
worker線程執(zhí)行任務(wù)
部分源碼如下
final void runWorker(Worker w) {
Thread wt = Thread.currentThread();
Runnable task = w.firstTask;
w.firstTask = null;
w.unlock(); // allow interrupts
boolean completedAbruptly = true;
try {
//循環(huán)從隊(duì)列拿任務(wù)
while (task != null || (task = getTask()) != null) {
//執(zhí)行任務(wù)前枷鎖
w.lock();
if ((runStateAtLeast(ctl.get(), STOP) ||
(Thread.interrupted() &&
runStateAtLeast(ctl.get(), STOP))) &&
!wt.isInterrupted())
wt.interrupt();
try {
beforeExecute(wt, task);
Throwable thrown = null;
try {
//這里是執(zhí)行我們傳入的任務(wù)
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
}
completedAbruptly = false;
} finally {
//如果拿不到任務(wù) 回收自己
processWorkerExit(w, completedAbruptly);
}
}
在Worker類中的run方法調(diào)用了runWorker方法來(lái)執(zhí)行任務(wù)低散,runWorker方法的執(zhí)行過(guò)程如下:
1.while循環(huán)不斷地通過(guò)getTask()方法獲取任務(wù)。
2.getTask()方法從阻塞隊(duì)列中取任務(wù)骡楼。
3.task.run()執(zhí)行任務(wù)熔号。
4.如果getTask結(jié)果為null則跳出循環(huán),執(zhí)行processWorkerExit()方法鸟整,銷毀線程引镊。