僅大致過了下,有問題的請指出,謝謝。
1.8通過乙個樣本場景了解新增任務流程。
執行緒池配置:
任務:輸出1,睡眠300s,輸出2
執行:新增9個任務至執行緒池
submit
提交任務使用submit()
方法,如下:關鍵方法execute
public future<
?>
submit
(runnable task)
executepublic
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
方法中,會start
worker
執行緒,執行其run
方法,最終執行threadpoolexecutor
d的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可以顯示出類的繼承和實現結構,包括它的父類和...