執行緒池的引數及執行順序

2021-10-23 15:04:08 字數 1573 閱讀 8342

降低系統資源消耗,通過復用已存在的執行緒,降低執行緒建立和銷毀造成的開銷;

提高系統響應速度,當有任務到達時,通過復用已存在的執行緒,無需等待新執行緒建立便立即能夠執行。

方便執行緒併發數的管控,因為執行緒是稀缺資源,若是無限制的建立,可能會導致記憶體占用過多而產生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...