執行緒池worker介紹
阿新 • • 發佈:2018-12-14
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
官方文件介紹: Class Worker主要維護正在執行任務的執行緒的中斷控制狀態,以及其他的次要資訊。
這個類擴充套件AbstractQueuedSynchronizer以簡化獲取和釋放鎖。 這可以防止中斷意圖喚醒等待任務的工作執行緒而不是去中斷一個將要被執行的任務。
我們實現了一個簡單的非重入互斥鎖而不是使用ReentrantLock,因為我們不希望工作任務在呼叫setCorePoolSize等池控制方法時能夠重新獲取鎖。
此外,為了線上程實際開始執行任務之前禁止中斷,我們將鎖定狀態初始化為負值,並在啟動時清除它(在runWorker中)。
欄位介紹: final Thread thread:執行這個worker的執行緒 Runnable firstTask:初始的要被執行的任務 volatile long completedTasks:執行緒的任務計數器,儲存當前執行緒執行了多少個任務
方法介紹:
Worker(Runnable firstTask) {
setState(-1); // 在執行runWorker方法之前禁止中斷
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);
}
//把執行委託給外部類的runWorker方法
public void run() {
runWorker(this);
}
//Lock方法,已鎖為1,沒鎖為0
//嘗試獲取方法,一次CAS更新state值為1
protected boolean tryAcquire(int unused) {
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread (Thread.currentThread());
return true;
}
return false;
}
//嘗試釋放鎖,這裡是直接設定狀態為0,代表鎖一定能被釋放
protected boolean tryRelease(int unused) {
setExclusiveOwnerThread(null);
setState(0);
return true;
}
//當任務被啟動才執行中斷
void interruptIfStarted() {
//state為-1時,任務還沒執行,執行緒不允許中斷;當前任務的執行緒不為null,表示成功建立了執行緒去執行當前任務;且當前任務沒有被中斷過;三個條件都滿足才允許中斷
Thread t;
if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
try {
t.interrupt();
} catch (SecurityException ignore) {
}
}
}