newcachedthreadpool:
public static executorservice newcachedthreadpool()
newfixedthreadpool:
public static executorservice newfixedthreadpool(int nthreads)
newsinglethreadexecutor:
public static executorservice newsinglethreadexecutor()
newscheduledthreadpool:
public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)
執行緒池任務執行流程:
當執行緒池小於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 newfixedthreadpool newsinglethreadexecutor newscheduledthreadpool 執行緒池任務執行流程 當執行緒池小於 corepoolsize 時,新提交任務將建立乙個新執行緒執行任務,即使此時執行緒池中存在...
執行緒池的種類和使用場景
newcachedthreadpool newfixedthreadpool newsinglethreadexecutor newscheduledthreadpool 執行緒池任務執行流程 當執行緒池小於corepoolsize時,新提交任務將建立乙個新執行緒執行任務,即使此時執行緒池中存在空閒...
執行緒池的各種使用場景
1 高併發 任務執行時間短的業務,執行緒池執行緒數可以設定為cpu核數 1,減少執行緒上下文的切換 2 併發不高 任務執行時間長的業務要區分開看 a 假如是業務時間長集中在io操作上,也就是io密集型的任務,因為io操作並不占用cpu,所以不要讓所有的cpu閒下來,可以加大執行緒池中的執行緒數目,讓...