執行緒池引數及佇列

2021-10-09 09:19:09 字數 1999 閱讀 1978

引數名

含義corepoolsize

核心執行緒數

maximumpoolsize

最大執行緒數

keepalivetime+時間單位

空閒執行緒的存活時間

workqueue

用於存放任務的佇列

threadfactory

執行緒工廠、用來建立新執行緒

handler

處理別拒絕的任務

corepoolsize是核心執行緒數,也就是常駐執行緒池的執行緒數量,與它對應的是maximumpoolsize,表示執行緒執行緒池最大執行緒數量,當任務特別多對而corepoolsize核心執行緒數無法滿足需求時,就會向執行緒池中增加執行緒,以便應對突增的情況。

如上圖所示,當提交任務的時候,會先檢查當前的執行緒數,如何小於核心執行緒數,則新建執行緒bin執行任務,當執行緒達到核心執行緒數,此時就會將任務放到workqueue佇列中,等核心執行緒數執行完從workqueue中取出任務。如果workqueue的容量到達上過線,這時候就會啟用後備力量,也就是maximumpoolsize最大執行緒數。執行緒池的新增順序是corepoolsize、workqueue、maximumpoolsize。

執行緒池阻塞佇列

fixedthreadpool

linkedblockingqueue

singlethreadexecutor

linkedblockingqueue

cachedthreadpool

synchronousqueue

scheduledthreadpool

delayedworkqueue

singlethreadscheduledexecutor

delayedworkqueue

第一種阻塞佇列是 linkedblockingqueue,它的容量是 integer.max_value,為 231 -1 ,是乙個非常大的值,可以認為是無界佇列。

fixedthreadpool 和 singlethreadexecutor 執行緒池的執行緒數是固定的,所以沒有辦法增加特別多的執行緒來處理任務,這時就需要 linkedblockingqueue 這樣乙個沒有容量限制的阻塞佇列來存放任務。

第二種阻塞佇列是 synchronousqueue,對應的執行緒池是 cachedthreadpool。執行緒池 cachedthreadpool 的最大執行緒數是 integer.max_value,可以理解為執行緒數是可以無限擴充套件的。

cachedthreadpool 和上一種執行緒池 fixedthreadpool 的情況恰恰相反,fixedthreadpool 的情況是阻塞佇列的容量是無限的,而這裡 cachedthreadpool 是執行緒數可以無限擴充套件,所以 cachedthreadpool 執行緒池並不需要乙個任務佇列來儲存任務,因為一旦有任務被提交就直接**給執行緒或者建立新執行緒來執行,而不需要另外儲存它們。

我們自己建立使用 synchronousqueue 的執行緒池時,如果不希望任務被拒絕,那麼就需要注意設定最大執行緒數要盡可能大一些,以免發生任務數大於最大執行緒數時,沒辦法把任務放到佇列中也沒有足夠執行緒來執行任務的情況。

第三種阻塞佇列是delayedworkqueue,它對應的執行緒池分別是 scheduledthreadpool 和 singlethreadscheduledexecutor,這兩種執行緒池的最大特點就是可以延遲執行任務,比如說一定時間後執行任務或是每隔一定的時間執行一次任務。delayedworkqueue 的特點是內部元素並不是按照放入的時間排序,而是會按照延遲的時間長短對任務進行排序,內部採用的是「堆」的資料結構(堆的應用之一就是優先順序佇列)。之所以執行緒池 scheduledthreadpool 和 singlethreadscheduledexecutor 選擇 delayedworkqueue,是因為它們本身正是基於時間執行任務的,而延遲佇列正好可以把任務按時間進行排序,方便任務的執行。

執行緒池及核心引數

一般來說,執行緒的生命週期需要通過 new 新建 start 就緒 running 執行中 dead 消亡 假設每個狀態到下乙個狀態需要的時間是 1,2,3 秒 但是我們往往只是關心running 那個狀態就可以了,這是執行緒需要執行的任務 使用執行緒池,建立一定數量的執行緒,專門執行任務的run ...

執行緒池核心引數及引數設定

2.執行緒池引數設定 threadpoolexecutor是建立執行緒池的核心類,它定義了一些建構函式用來建立執行緒池,如下是它的其中乙個建構函式 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepaliv...

執行緒池引數

由於系統頻繁的建立和銷毀執行緒,因而使用執行緒池讓建立的執行緒進行復用 1.corepoolsize 指定了執行緒池中的執行緒數量 2.maximumpoolsize 執行緒池中最大執行緒數量 3.keepalivetime 當執行緒池中的執行緒數超過corepoolsize,多餘的空閒的執行緒的存...