執行緒池的種類,區別和使用場景

2022-05-15 02:27:31 字數 1356 閱讀 7936

newcachedthreadpool:

newfixedthreadpool:

newsinglethreadexecutor:

newscheduledthreadpool:

執行緒池任務執行流程:

當執行緒池小於

corepoolsize

時,新提交任務將建立乙個新執行緒執行任務,即使此時執行緒池中存在空閒執行緒。

當執行緒池達到

corepoolsize

時,新提交任務將被放入

workqueue

中,等待執行緒池中任務排程執行

當workqueue

已滿,且

maximumpoolsize>corepoolsize

時,新提交任務會建立新執行緒執行任務

當提交任務數超過

maximumpoolsize

時,新提交任務由

rejectedexecutionhandler

處理 當執行緒池中超過

corepoolsize

執行緒,空閒時間達到

keepalivetime

時,關閉空閒執行緒

當設定allowcorethreadtimeout(true)

時,執行緒池中

corepoolsize

執行緒空閒時間達到

keepalivetime

也將關閉

備註:一般如果執行緒池任務佇列採用linkedblockingqueue佇列的話,那麼不會拒絕任何任務(因為佇列大小沒有限制),這種情況下,

threadpoolexecutor

最多僅會按照最小執行緒數來建立執行緒,也就是說執行緒池大小被忽略了。

如果執行緒池任務佇列採用arrayblockingqueue佇列的話,那麼

threadpoolexecutor

將會採取乙個非常負責的演算法,比如假定執行緒池的最小執行緒數為

4,最大為

8所用的

arrayblockingqueue

最大為10

。隨著任務到達並被放到佇列中,執行緒池中最多執行

4個執行緒(即最小執行緒數)。即使佇列完全填滿,也就是說有

10個處於等待狀態的任務,

threadpoolexecutor

也只會利用

4個執行緒。如果佇列已滿,而又有新任務進來,此時才會啟動乙個新執行緒,這裡不會因為佇列已滿而拒接該任務,相反會啟動乙個新執行緒。新執行緒會執行佇列中的第乙個任務,為新來的任務騰出空間。

這個演算法背後的理念是:該池大部分時間僅使用核心執行緒(4個),即使有適量的任務在佇列中等待執行。這時執行緒池就可以用作節流閥。如果擠壓的請求變得非常多,這時該池就會嘗試執行更多的執行緒來清理;這時第二個節流閥—最大執行緒數就起作用了。

執行緒池的種類,區別和使用場景

newcachedthreadpool public static executorservice newcachedthreadpool newfixedthreadpool public static executorservice newfixedthreadpool int nthreads...

執行緒池的種類和使用場景

newcachedthreadpool newfixedthreadpool newsinglethreadexecutor newscheduledthreadpool 執行緒池任務執行流程 當執行緒池小於corepoolsize時,新提交任務將建立乙個新執行緒執行任務,即使此時執行緒池中存在空閒...

執行緒池的各種使用場景

1 高併發 任務執行時間短的業務,執行緒池執行緒數可以設定為cpu核數 1,減少執行緒上下文的切換 2 併發不高 任務執行時間長的業務要區分開看 a 假如是業務時間長集中在io操作上,也就是io密集型的任務,因為io操作並不占用cpu,所以不要讓所有的cpu閒下來,可以加大執行緒池中的執行緒數目,讓...