Java中級之執行緒池原始碼剖析

2021-09-20 10:47:22 字數 2563 閱讀 9194

,引用必須註明出處!

執行緒池伴隨著執行緒的產生而產生,主要用於執行緒復用,減少記憶體洩露。

執行緒池中使用thread作為執行體,使用runnable介面作為執行者,乙個個執行者以任務的方式在執行體裡完成。

任務以下指乙個實現runnable介面的worker物件,任務放在thread中被執行

原理:corepoolsize:活躍執行緒數量,以下簡稱core(不能小於0)

maxpoolsize:執行緒池總數量,以下簡稱max(不能小於0,core必須小於max)

keepalivetime:超過core個執行緒的空閒時間,超時被停止,以下簡稱keep(不能小於0)

ctl:配合isrunning方法,用來標記執行緒數和執行狀態,如不符合則執行緒池被關閉。

乙個新任務被加入,如果執行緒數量小於core,則新建乙個執行緒,直到數量等於core;

executorservice:

newcachedthreadpool 無界線程池,可動態改造,預設執行器,以下簡稱cached

newfixedthreadpool 固定大小的執行器,以下簡稱fixed,預設executorservice

newsinglethreadexecutor 單執行緒執行器,以下簡稱single

queue:

synchronousqueue 無需等待,直接進入執行緒執行,要求使用cached,否則一時無線程則任務被拋棄

linkedblockingqueue 無界佇列,用於core繁忙時等待,任務之間互相無影響,優勢是可以短時間接受大量任務

arrayblockingqueue 有界佇列,使用大池子和小佇列,來減少資源消耗(cpu、io、執行緒切換)

policy:

rejectedexecutionhandler 當executorservice shutdown時,丟擲拒絕的異常

callerrunspolicy:減緩任務的執行速率

discardpolicy: 直接拋棄

discardoldestpolicy:位於棧頂的任務被拋棄,會重新執行此任務,則拋棄老的任務

worker:

使用abstractqueuedsynchronizer鎖

第一、保證操作去喚醒乙個等待的任務,而不是中斷乙個正在執行的任務

第二、作為乙個互斥鎖,不使用reentrantlock,希望在呼叫setcorepoolsize方法後,不必使worker重新獲得鎖

execute方法:

任務將會在乙個執行緒中被處理,執行緒可能是乙個新執行緒(執行緒數小於corepoolsize),也可能是乙個已經存在的執行緒(執行緒數大於corepoolsize,小於maxpoolsize)

4種情況會被拒絕執行:

第一、執行緒池已經shudown(主動執行shutdown,或被interrupt)

第二、執行緒數已經超過maxpoolsize(可設為integer.max_value以防止發生)

第三、執行緒池為空

第四、超時

拒絕執行,如果使用的handler為rejectedexecutorhandler(預設),則任務被拋棄,並報錯

執行緒沒有runtimepermission,則會被停止

執行前後,分別會執行beforeexecute和afterexecute

執行:小於core則new新thread

大於core則優先進入queue等待

如不能則new新thread

大於max則任務預設被拒絕

shutdown方法:

順序關閉所有任務(任務池的執行緒仍會執行完畢,但新任務不再被接受)

executor長久不被呼叫,同時無剩餘執行緒,會自動執行shutdown;

實現方式:

目的讓空閒執行緒被殺掉

方式有二,設定keep時間短一點,其次設定core小一點同是allowcorethreadtimeout為true

shutdownnow方法:

立即停止所有任務,包含正在執行的,並返回這些「正在執行的任務」的list集合

remove方法:

停止未執行的任務;如果使用submit把任務當成future型別,則不會停止 

purge方法:

清除已經被停止的future任務,用於儲存功能改造;如果被其他執行緒干擾,則會失敗。

判斷啟動corepool的數量:

prestartcorethread:啟動一條core執行緒

ensureprestart:同上,如果corepoolsize為0也啟動一條執行緒

prestartallcorethreads:將所有core執行緒均啟動

tips:

1、如果任務數大於core但小於max,則新執行緒被建立(建議max為integer.max_value)

將allowcorethreadtimeout設為true,可以讓core同樣有此功效(時間需要大於0,超時後乙個個被interrupt),設定後直接把執行的空閒任務全部清除

2、為獲得更大效率,一般io讀寫設定core為2*cpusize,邏輯較多避免上下文切換,設定為cpusize

3、submit比 exexute僅多乙個返回值,標識完成。

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

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

原始碼剖析之CopyOnWriteArrayList

copyonwritearraylist jdk1.5新增的執行緒安全的arraylist實現。b 使用場景 讀取頻繁,寫較少。理由 底層的安全性 本質上是依賴於執行緒讀取的資料副本來實現的。因此每次寫都是要複製底層陣列資料的,如果寫頻繁勢必會造成大量的效能消耗。如果寫非常頻繁,那麼可以根據實際情況...

原始碼學習 執行緒池原始碼自學篇

執行緒池作為專案中經常用到的類,也在面試中備受青睞,個人對於原始碼也只是讀過一些,很多知識點都是一知半解,藉此機會自己再溫故一下。我是在邊自學邊寫這些東西,可能語言上或者邏輯上不太完善,請大家不要介意。執行緒池是什麼?官網解釋 執行緒池主要解決兩個問題 在需要執行大量執行緒的場景,減少建立每個執行緒...