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閒下來,可以加大執行緒池中的執行緒數目,讓...