執行緒池 引數和工作流程

2022-07-25 08:30:13 字數 2574 閱讀 7142

threadpoolexecutor建構函式如下

corepoolsize 指的是核心執行緒數,執行緒池初始化時執行緒數預設為 0,當有新的任務提交後,會建立新執行緒執行任務,如果不做特殊設定,此後執行緒數通常不會再小於 corepoolsize ,因為它們是核心執行緒,即便未來可能沒有可執行的任務也不會被銷毀。需要注意,此值如果設定的比較小,則會頻繁的建立和銷毀執行緒;如果設定的比較大,則會浪費系統資源,所以開發者需要根據自己的實際業務來調整此值。

(2)maximumpoolsize

maximumpoolsize,最大執行緒數,表示執行緒池最大可以建立的執行緒數。當達到核心執行緒數後,同時任務佇列滿了之後,執行緒池會進一步建立新執行緒,最多可以達到 maximumpoolsize 來應對任務多的場景。

(3)keepalivetime + 時間單位unit

keepalivetime,當執行緒池中線程數量多於核心執行緒數時,而此時又沒有任務可做,執行緒池就會檢測線程的 keepalivetime,如果超過規定的時間,無事可做的執行緒就會被銷毀,以便減少記憶體的占用和資源消耗。如果後期任務又多了起來,執行緒池也會根據規則重新建立執行緒,所以這是乙個可伸縮的過程,比較靈活,我們也可以用 setkeepalivetime 方法動態改變 keepalivetime 的引數值。

時間單位unit ,表示存活時間的單位,它是配合 keepalivetime 引數共同使用的。

(4)threadfactory

threadfactory 實際上是乙個執行緒工廠,它的作用是生產線程以便執行任務。我們可以選擇使用預設的執行緒工廠,建立的執行緒都會在同乙個執行緒組,並擁有一樣的優先順序,且都不是守護執行緒,我們也可以選擇自己定製執行緒工廠,以方便給執行緒自定義命名,不同的執行緒池內的執行緒通常會根據具體業務來定製不同的執行緒名。

(5)workqueue

workqueue表示執行緒池執行的任務佇列,隨著任務的不斷增加,執行緒數會逐漸增加並達到核心執行緒數,此時如果仍有任務被不斷提交,就會被放入 workqueue 任務佇列中。

(6)handler

handler,表示指定執行緒池的拒絕策略,當執行緒池的任務已經在快取佇列workqueue中儲存滿了之後,並且不能建立新的執行緒來執行此任務時(達到最大執行緒數maximumpoolsize後 ),就會使用使用拒絕策略,它屬於一種限流保護的機制。

execute()原始碼

執行緒池的工作流程要從它的執行方法 execute() 說起,原始碼如下:

其中 addworker(runnable firsttask, boolean core) 方法的引數說明如下:

(1)firsttask,執行緒應首先執行的任務,如果沒有則可以設定為 null。

(2)core,判斷是否可以建立執行緒的閥值(最大值),如果等於 true 則表示使用 corepoolsize 作為閥值,false 則表示使用 maximumpoolsize 作為閥值。

執行緒池任務執行的主要流程

如上圖所示,當提交任務後,執行緒池首先會檢查當前執行緒數,如果此時執行緒數小於核心執行緒數,比如最開始執行緒數量為 0,則新建執行緒並執行任務,隨著任務的不斷增加,執行緒數會逐漸增加並達到核心執行緒數,此時如果仍有任務被不斷提交,就會被放入 workqueue 任務佇列中,等待核心執行緒執行完當前任務後重新從 workqueue 中提取正在等待被執行的任務。

此時,假設我們的任務特別的多,已經達到了 workqueue 的容量上限,這時執行緒池會在 corepoolsize 核心執行緒數的基礎上繼續建立執行緒來執行任務直到執行緒數達到 maximumpoolsize 最大執行緒數,如果依然有任務被提交,這就超過了執行緒池的最大處理能力,這個時候執行緒池就會使用拒絕策略來拒絕這些任務。隨著佇列中任務被執行完,這時執行緒池就會檢測線程的 keepalivetime,如果超過規定的時間,大於核心執行緒數corepoolsize 的執行緒會被合理**,以便減少記憶體的占用和資源消耗。

submit() 和 execute()方法有什麼區別?(threadpoolexecutor 的執行方法有幾種?)

execute() 和 submit() 都是用來執行執行緒池任務的,它們最主要的區別是,submit() 方法可以接收執行緒池執行的返回值,而 execute() 不能接收返回值。

submit()方法可以配合futrue來接收執行緒執行的返回值。它們的另乙個區別是execute()方法屬於executor介面的方法,而 submit() 方法則是屬於 executorservice 介面的方法,它們的繼承關係如下圖所示:

執行緒池工作流程

工作流程 執行緒池剛建立時,裡面沒有乙個執行緒。任務佇列是作為引數傳進來的。不過,就算佇列裡面有任務,執行緒池也不會馬上執行它們。當呼叫 execute 方法新增乙個任務時,執行緒池會做如下判斷 1 如果正在執行的執行緒數量小於 corepoolsize,那麼馬上建立執行緒執行這個任務 2 如果正在...

執行緒和程序的工作流程

首先來一句概括的總論 程序和執行緒都是乙個時間段的描述,是cpu工作時間段的描述。下面細說背景 cpu ram 各種資源 比如顯示卡,光碟機,鍵盤,gps,等等外設 構成我們的電腦,但是電腦的執行,實際就是cpu和相關暫存器以及ram之間的事情。乙個最最基礎的事實 cpu太快,太快,太快了,暫存器僅...

jdk1 8執行緒池 基於原始碼了解工作流程

構造方法 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueue workqueue,threadfactory threadfacto...