執行緒池ThreadPoolExecutor詳解

2021-08-05 21:25:39 字數 2830 閱讀 5840

public

threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

引數名

作用corepoolsize

核心執行緒池大小

maximumpoolsize

最大執行緒池大小

keepalivetime

超過corepoolsize數目的空閒執行緒存活時間

timeunit

時間單位

blockingqueue

阻塞任務佇列

threadfactory

執行緒工廠

rejectedexecutionhandler

當提交任務數超過maximumpoolsize+blockingqueue之和時,任務會交給此handler處理

注意:

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

2. 當執行緒池達到corepoolsize時,新提交任務將被放入workqueue中,等待執行緒池中任務排程執行

3. .當workqueue已滿,且maximumpoolsize>corepoolsize時,新提交任務會建立新執行緒執行任務

4. 當提交任務數超過maximumpoolsize時,新提交任務由rejectedexecutionhandler處理

5. 當執行緒池中超過corepoolsize執行緒,空閒時間達到keepalivetime時,關閉空閒執行緒

6. 當設定allowcorethreadtimeout(true)時,執行緒池中corepoolsize執行緒空閒時間達到keepalivetime也將關閉

7. rejectedexecutionhandler,threadpoolexecutor類中有四個實現的靜態內部類,預設是abortpolicy

threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常。 

threadpoolexecutor.discardpolicy:也是丟棄任務,但是不丟擲異常。

threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)

threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理該任務

private

final atomicinteger ctl = new atomicinteger(ctlof(running, 0));

使用atomicinteger保證原子操作,通過巧妙操作(與&、非~),這個變數儲存著兩個資訊:

①有效執行緒數量

②執行緒池執行狀態runstate

public

void

execute(runnable command)

//活動執行緒數》=corepoolsize && runstate為running && 佇列未滿

if (isrunning(c) && workqueue.offer(command))

/*** 兩種情況:

* ① 非running狀態

* ② workcount > maximumpoolsize

*/else

if (!addworker(command, false))

reject(command);

}

3.1 newfixedthreadpool

構造乙個固定執行緒數目的執行緒池,corepoolsize=maximumpoolsize,使用了乙個無界linkedblockingqueue存放阻塞任務,永遠沒有多餘任務由rejectedexecutionhandler處理

public

static executorservice newfixedthreadpool(int nthreads)

3.2 newsinglethreadexecutor

構造只支援乙個執行緒的執行緒池,無界阻塞佇列linkedblockingqueue,保證任務由乙個執行緒序列執行。

public

static executorservice newsinglethreadexecutor()

3.3 newcachedthreadpool

構造乙個具有緩衝功能的執行緒池,corepoolsize=0,maximumpoolsize=integer.max_value,keepalivetime=60s,以及無容量的阻塞佇列synchronousqueue,因此任務提交後會馬上交給執行緒執行。

public

static executorservice newcachedthreadpool()

3.4 newscheduledthreadpool

構造有定時功能的執行緒池,配置corepoolsize,無界延遲阻塞佇列delayedworkqueue

public

static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...

mysql 執行緒池 c MySQL執行緒池

mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...