Java線程池中的工作線程Worker類源碼解析
ThreadPoolExecutor類圖

Worker類的聲明
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
線程池中的工作線程是通過(guò)內(nèi)部類Worker表示的。Worker繼承自AbstractQueueSynchronizer,可以實(shí)現(xiàn)同步器的功能;同是實(shí)現(xiàn)了Runable接口,因此Worker是可以當(dāng)做線程使用的。
Worker源碼分析
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
{
/**
* serialVersionUID
*/
private static final long serialVersionUID = 6138294804551838833L;
/** 當(dāng)前Worker對(duì)象運(yùn)行的環(huán)境 */
final Thread thread;
/** Worker要執(zhí)行的初始任務(wù),可能為null */
Runnable firstTask;
/** 每個(gè)線程執(zhí)行完的任務(wù)個(gè)數(shù) */
volatile long completedTasks;
/**
* 構(gòu)造器
*/
Worker(Runnable firstTask) {
//runWorker方法執(zhí)行前禁止中斷
setState(-1); // inhibit interrupts until runWorker
//初始化firstTask屬性
this.firstTask = firstTask;
//從線程工廠中創(chuàng)建一個(gè)線程
this.thread = getThreadFactory().newThread(this);
}
/**
* 重寫run方法
* 調(diào)用外部類ThreadPoolExecutor的runWorker方法
*/
public void run() {
runWorker(this);
}
// 以下是鎖的方法
//
// state等于0 表示解鎖狀態(tài)
// state等于1 表示加鎖狀態(tài)
/**
* 判斷是否處于獨(dú)占鎖狀態(tài)
*/
protected boolean isHeldExclusively() {
return getState() != 0;
}
/**
* 嘗試加鎖
*/
protected boolean tryAcquire(int unused) {
//CAS修改state狀態(tài)0----->1
if (compareAndSetState(0, 1)) {
//如果CAS成功
//將當(dāng)前線程設(shè)置為鎖的持有者
setExclusiveOwnerThread(Thread.currentThread());
//返回加鎖成功
return true;
}
//返回加鎖失敗
return false;
}
/**
* 嘗試解鎖
*/
protected boolean tryRelease(int unused) {
//將鎖的持有者設(shè)置為null
setExclusiveOwnerThread(null);
//將state狀態(tài)設(shè)置為0
setState(0);
//返回解鎖成功
return true;
}
/** 加鎖方法,調(diào)用父類AQS的acquire方法 */
public void lock() { acquire(1); }
/** 嘗試加鎖方法,調(diào)用tryAcquire方法 */
public boolean tryLock() { return tryAcquire(1); }
/** 解鎖方法,調(diào)用父類AQS的release方法 */
public void unlock() { release(1); }
/** 判斷當(dāng)前是否處于加鎖狀態(tài) */
public boolean isLocked() { return isHeldExclusively(); }
/** 中斷,當(dāng)線程啟動(dòng)后才能被中斷 */
void interruptIfStarted() {
//線程對(duì)象
Thread t;
//如果state值大于等于0(初始狀態(tài)為-1)
//Worker對(duì)象的thread屬性非空
//t.isInterruted為false,線程未被中斷
if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
try {
t.interrupt();
} catch (SecurityException ignore) {
}
}
}
}總結(jié)
- 線程池的Worker類實(shí)現(xiàn)了一個(gè)不可重入的互斥鎖,其實(shí)現(xiàn)主要是依賴AQS類。
- Worker類繼承自AQS,實(shí)現(xiàn)了加鎖/解鎖等方法。
- Worker類實(shí)現(xiàn)了Runable接口,重寫了run方法,其主要執(zhí)行邏輯依托于外部類的runWorker方法。在runWorker方法中將會(huì)獲取用戶提交的任務(wù),將其放在線程池中異步執(zhí)行,并維護(hù)線程池中線程的創(chuàng)建和回收等動(dòng)作。
到此這篇關(guān)于Java線程池中的工作線程Worker類源碼解析的文章就介紹到這了,更多相關(guān)Java工作線程Worker類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?MVC中JSON數(shù)據(jù)處理方式實(shí)戰(zhàn)案例
Spring MVC是個(gè)靈活的框架,返回JSON數(shù)據(jù)的也有很多五花八門的方式,下面這篇文章主要給大家介紹了關(guān)于Spring?MVC中JSON數(shù)據(jù)處理方式的相關(guān)資料,需要的朋友可以參考下2024-01-01
把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn)
這篇文章主要介紹了把Java程序轉(zhuǎn)換成exe,可直接運(yùn)行的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
SpringBoot使用ip2region獲取地理位置信息的方法
這篇文章主要介紹了SpringBoot使用ip2region獲取地理位置信息的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Spring sentinel哨兵模式相關(guān)原理解析
這篇文章主要介紹了Spring sentinel哨兵模式相關(guān)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Servlet和Spring?MVC的區(qū)別及使用說(shuō)明
這篇文章詳細(xì)介紹了Servlet和SpringMVC的基本概念、工作原理、功能對(duì)比和應(yīng)用場(chǎng)景,Servlet是JavaWeb開(kāi)發(fā)的基礎(chǔ),而SpringMVC是一個(gè)基于Servlet的高級(jí)框架,提供了更強(qiáng)大的功能和易用性,文章通過(guò)定義、原理和示例代碼,幫助讀者理解這兩個(gè)技術(shù)的區(qū)別與聯(lián)系2025-01-01

