執行緒池原始碼閱讀(二)

2021-10-02 06:15:59 字數 3113 閱讀 1666

僅大致過了下,有問題的請指出,謝謝。

1.8通過乙個樣本場景了解新增任務流程。

執行緒池配置:

任務:輸出1,睡眠300s,輸出2

執行:新增9個任務至執行緒池

submit

提交任務使用submit()方法,如下:關鍵方法execute

public future<

?>

submit

(runnable task)

execute
public

void

execute

(runnable command)if(

isrunning

(c)&& workqueue.

offer

(command)

)elseif(

!addworker

(command,

false))

reject

(command);}

private

boolean

addworker

(runnable firsttask,

boolean core)

}boolean workerstarted =

false

;boolean workeradded =

false

; worker w = null;

try}

finally

if(workeradded)}}

finally

return workerstarted;

}

第一步:當前執行緒數 < 核心執行緒數

執行addworker新增core執行緒:進入addworker

死迴圈1

獲取執行狀態:rs檢查執行狀態是否為running,任務是否為null

死迴圈2

獲取worker執行緒數:wc檢查worker執行緒數:沒有核心執行緒可建立則返回false

cas增加worker執行緒數,break死迴圈1

cas失敗,continue死迴圈1

使用任務構造worker物件,且仍處於running,另執行緒未start()

- 將worker物件加入workers執行緒池集合,並啟動worker執行緒不處於runnging或其他異常,將worker物件從workers執行緒池集合中remove

第二步:當前執行緒數 == 核心執行緒數,任務佇列未滿

仍處於running且任務入隊成功

二次檢查:非執行態?

移除任務拒絕

workers執行緒是否為0:addworker新增非core執行緒

(ps:這一塊看注釋是上次檢查後,有執行緒死亡或執行緒池shut down,但如果因此需要二次檢查,為什麼不進行三次檢查?另外,為什麼是當前執行緒為0執行addworker非core執行緒?)

第三步:當前執行緒數 == 核心執行緒數,任務佇列滿

執行addworker新增非core執行緒,失敗則拒絕。

addworker方法中,會startworker執行緒,執行其run方法,最終執行threadpoolexecutord的runworker方法。

while (task != null || (task = gettask()) != null)gettask會從任務佇列取任務執行。

final

void

runworker

(worker w)

catch

(runtimeexception x)

catch

(error x)

catch

(throwable x)

finally

}finally

} completedabruptly =

false;}

finally

}

private

void

processworkerexit

(worker w,

boolean completedabruptly)

finally

tryterminate()

;int c = ctl.

get();

if(runstatelessthan

(c, stop)

)addworker

(null,

false);

}}

執行runworker時,通過gettask取到任務後,會進行thread.interrupted()判斷執行緒是否被中斷。

void

interruptifstarted()

catch

(securityexception ignore)

}}

!t.isinterrupted() && w.trylock(),空閒執行緒中斷標誌位為false不持鎖。

private

void

interruptidleworkers

(boolean onlyone)

catch

(securityexception ignore)

finally}if

(onlyone)

break;}

}finally

}

mysql 執行緒池原始碼 執行緒池原始碼解析

1.前言 我個人覺得理論性的東西可能大家都懂,但是具體的實現細節可能並不是很清楚所以才想記錄一下,加深記憶。2.關鍵原始碼解析 1 ctl private final atomicinteger ctl new atomicinteger ctlof running,0 private static...

原始碼閱讀 執行緒池 執行緒池原理(九)相關介面介紹

這篇文章將會介紹 1 threadfactory介面 2 rejectexecutionhandler介面,該文章只是讓眾位知道有這兩個介面存在,無任何深度,不喜,跳過即可 1 threadfactory執行緒工廠介面,用於執行緒池建立執行緒 public inte ce threadfactory...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...