1.前言
我個人覺得理論性的東西可能大家都懂,但是具體的實現細節可能並不是很清楚所以才想記錄一下,加深記憶。
2.關鍵原始碼解析
(1)ctl
private final atomicinteger ctl = new atomicinteger(ctlof(running, 0));private static final int count_bits = integer.size - 3;private static final int capacity = (1 << count_bits) - 1;//runstate is stored in the high-order bits
private static final int running = -1 <
private static int runstateof(int c) private static int workercountof(int c) private static int ctlof(int rs, int wc)
ctl 一共32位,高3位表示執行緒池的狀態,剩下的29位表示執行中的執行緒數
(2) execute(runnable command)
int c =ctl.get();//當前執行緒數小於核心執行緒數
if (workercountof(c)
if (addworker(command, true))return;
c=ctl.get();
}//當前執行緒數大於等於核心執行緒數//檢查執行緒池狀態,並將任務新增到佇列中,可以新增成功代表佇列未滿
if (isrunning(c) &&workqueue.offer(command)) //佇列已滿,產生新增非核心執行緒,執行任務,如果失敗則拒絕任務
else if (!addworker(command, false))
reject(command);
(3) addworker(runnable firsttask, boolean core)
worker 這個類繼承了aqs 並且實現了runnable 介面,所以它具有乙個鎖的功能,它的run()方法最終呼叫了threadpoolexecutor 的 runworker 方法,runwoorker()中通過gettask()獲取任務,並且執行了任務的run()方法
private boolean addworker(runnable firsttask, booleancore) boolean workerstarted = false;boolean workeradded = false;
worker w= null;tryfinallyif(workeradded) finallyreturnworkerstarted;
woker 的run方法執行呼叫 runworker ,並傳入自身
final voidrunworker(worker w) catch(runtimeexception x) catch(error x) catch(throwable x) finallyfinallyfinallyint wc =workercountof(c);//are workers subject to culling?//是否允許所有執行緒超時,或者當前工作執行緒大於核心執行緒數,所有執行緒都可以超時意思就是核心執行緒和非核心執行緒沒什麼區別
boolean timed = allowcorethreadtimeout || wc >corepoolsize;//超時則返回空
if ((wc > maximumpoolsize || (timed &&timedout))&& (wc > 1 ||workqueue.isempty())) trycatch(interruptedexception retry) {
timedout= false;
mysql 執行緒池 Mysql 執行緒池
why 在5.6以前,mysql會對每個連線建立乙個執行緒,請求結束後銷毀執行緒。在高併發的情況下,為了避免頻繁建立和釋放連線,可以通過thread cache將執行緒快取起來,請求來了先嘗試從cache中獲取,重複利用執行緒資源。問題在低併發的情況下,thread cache可以成為乙個有效的優化...
mysql 執行緒池 c MySQL執行緒池
mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...
python 執行緒池 python執行緒池原始碼解析
本篇主要講下threadpoolexecutor的實現。由於業務量不大,且一直使用框架進行程式設計,對執行緒的理解一直很模糊,基本處於不想阻塞程式執行,起乙個執行緒啟動任務的階段。總感覺自己好像會執行緒一樣,實則一直處於一種懵懂狀態,通過一段時間檢視一些別人寫的原始碼,終於有所悟,也記錄下自己的學習...