降低系統資源消耗,通過復用已存在的執行緒,降低執行緒建立和銷毀造成的開銷;
提高系統響應速度,當有任務到達時,通過復用已存在的執行緒,無需等待新執行緒建立便立即能夠執行。
方便執行緒併發數的管控,因為執行緒是稀缺資源,若是無限制的建立,可能會導致記憶體占用過多而產生oom,並且會造成cpu過度切換。使用執行緒池能夠進行統一分配、調優和監控。
提供更強大的功能,延時定時執行緒池。
public
threadpoolexecutor
(int corepoolsize,
int maximumpoolsize,
long keepalivetime, timeunit unit, blockingqueue
workqueue)
1 corepoolsize:核心執行緒數
核心執行緒會一直存活,及時沒有任務需要執行
當執行緒數小於核心執行緒數時,即使有執行緒空閒,執行緒池也會優先建立新執行緒處理
設定allowcorethreadtimeout=true(預設false)時,核心執行緒會超時關閉
2 queuecapacity:任務佇列容量(阻塞佇列)
當核心執行緒數達到最大時,新任務會放在佇列中排隊等待執行
3 maxpoolsize:最大執行緒數
當執行緒數》=corepoolsize,且任務佇列已滿時。執行緒池會建立新執行緒來處理任務
當執行緒數=maxpoolsize,且任務佇列已滿時,執行緒池會拒絕處理任務而丟擲異常
4 keepalivetime:執行緒空閒時間
當執行緒空閒時間達到keepalivetime時,執行緒會退出,直到執行緒數量=corepoolsize
如果allowcorethreadtimeout=true,則會直到執行緒數量=0
5 allowcorethreadtimeout:允許核心執行緒超時
6 threadfactory 執行緒工廠
建立乙個新執行緒時使用的工廠,可以用來設定執行緒名、是否為daemon執行緒等等
7 rejectedexecutionhandler:任務拒絕處理器
兩種情況會拒絕處理任務:
當執行緒數已經達到maxpoolsize,切佇列已滿,會拒絕新任務
當執行緒池被呼叫shutdown()後,會等待執行緒池裡的任務執行完畢,再shutdown。如果在呼叫shutdown()和執行緒池真正shutdown之間提交任務,會拒絕新任務
執行緒池會呼叫rejectedexecutionhandler來處理這個任務。如果沒有設定預設是abortpolicy,會丟擲異常
threadpoolexecutor類有幾個內部實現類來處理這類情況:
abortpolicy 丟棄任務,拋執行時異常
callerrunspolicy 執行任務
discardpolicy 忽視,什麼都不會發生
discardoldestpolicy 從佇列中踢出最先進入佇列(最後乙個執行)的任務
實現rejectedexecutionhandler介面,可自定義處理器
執行緒池多工的執行順序
執行緒池場景 面試官 假設我們有乙個執行緒池,核心執行緒數為10,最大執行緒數也為20,任務隊列為100。現在來了100個任務,執行緒池裡現在有幾個執行緒執行?粉絲豪 應該是10吧。面試官 你確定?粉絲豪 確定啊,就是10 於是乎,粉絲豪就回去等通知了 其實這道題正確的答案是 不一定!因為並沒指明是...
執行緒池及核心引數
一般來說,執行緒的生命週期需要通過 new 新建 start 就緒 running 執行中 dead 消亡 假設每個狀態到下乙個狀態需要的時間是 1,2,3 秒 但是我們往往只是關心running 那個狀態就可以了,這是執行緒需要執行的任務 使用執行緒池,建立一定數量的執行緒,專門執行任務的run ...
執行緒池引數及佇列
引數名 含義corepoolsize 核心執行緒數 maximumpoolsize 最大執行緒數 keepalivetime 時間單位 空閒執行緒的存活時間 workqueue 用於存放任務的佇列 threadfactory 執行緒工廠 用來建立新執行緒 handler 處理別拒絕的任務 corep...