Java線程池中的工作線程Worker類(lèi)源碼解析
ThreadPoolExecutor類(lèi)圖
Worker類(lèi)的聲明
private final class Worker extends AbstractQueuedSynchronizer implements Runnable
線程池中的工作線程是通過(guò)內(nèi)部類(lè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); } /** * 重寫(xiě)run方法 * 調(diào)用外部類(lèi)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)用父類(lèi)AQS的acquire方法 */ public void lock() { acquire(1); } /** 嘗試加鎖方法,調(diào)用tryAcquire方法 */ public boolean tryLock() { return tryAcquire(1); } /** 解鎖方法,調(diào)用父類(lèi)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類(lèi)實(shí)現(xiàn)了一個(gè)不可重入的互斥鎖,其實(shí)現(xiàn)主要是依賴AQS類(lèi)。
- Worker類(lèi)繼承自AQS,實(shí)現(xiàn)了加鎖/解鎖等方法。
- Worker類(lèi)實(shí)現(xiàn)了Runable接口,重寫(xiě)了run方法,其主要執(zhí)行邏輯依托于外部類(lèi)的runWorker方法。在runWorker方法中將會(huì)獲取用戶提交的任務(wù),將其放在線程池中異步執(zhí)行,并維護(hù)線程池中線程的創(chuàng)建和回收等動(dòng)作。
到此這篇關(guān)于Java線程池中的工作線程Worker類(lèi)源碼解析的文章就介紹到這了,更多相關(guān)Java工作線程Worker類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)ftp上傳下載、刪除文件及在ftp服務(wù)器上傳文件夾的方法
這篇文章主要介紹了Java實(shí)現(xiàn)ftp上傳下載、刪除文件及在ftp服務(wù)器上傳文件夾的方法,需要的朋友可以參考下2015-11-11關(guān)于快速測(cè)試API接口的一個(gè)新技能
這篇文章主要給大家介紹了關(guān)于快速測(cè)試API接口的一個(gè)新技能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總
這篇文章主要介紹了Java實(shí)現(xiàn)字符串倒序輸出的四種方法匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06很多人竟然不知道Java線程池的創(chuàng)建方式有7種
本文主要介紹了很多人竟然不知道Java線程池的創(chuàng)建方式有7種,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07java 實(shí)現(xiàn)web項(xiàng)目啟動(dòng)加載properties屬性文件
這篇文章主要介紹了java 實(shí)現(xiàn)web項(xiàng)目啟動(dòng)加載properties屬性文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解
這篇文章主要介紹了Java大數(shù)運(yùn)算BigInteger與進(jìn)制轉(zhuǎn)換詳解,Java 提供了 BigInteger(大整數(shù))類(lèi)和 BigDecimal(大浮點(diǎn)數(shù))類(lèi)用于大數(shù)運(yùn)算,這兩個(gè)類(lèi)都繼承自 Number 類(lèi)(抽象類(lèi)),由于 BigInteger 在大數(shù)運(yùn)算中更常見(jiàn),需要的朋友可以參考下2023-09-09idea中創(chuàng)建jsp項(xiàng)目的詳細(xì)實(shí)戰(zhàn)步驟
才學(xué)javaWeb,以防自己忘記創(chuàng)建項(xiàng)目的過(guò)程,所以淺淺的記錄一下吧,下面這篇文章主要給大家介紹了關(guān)于idea中創(chuàng)建jsp項(xiàng)目的詳細(xì)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09