使用執行緒池手動建立7大引數4大策略

2021-10-10 04:43:39 字數 2177 閱讀 6446

為什麼需要自己定義執行緒池

newfixedthreadpool,newsinglethreadexecutor,newcachedthreadpool實際呼叫的都是threadpoolexecutor方法,而這方法由7大引數,我們要使用執行緒池的時候最好自己定義執行緒池通過定義threadpoolexecutor的方式,所以有必要了解這7大引數的含義,以及執行緒池的工作流程,和4大拒絕策略

newfixedthreadpool原始碼,實際呼叫threadpoolexecutor

public

static executorservice newfixedthreadpool

(int nthreads, threadfactory threadfactory)

newsinglethreadexecutor

public

static executorservice newsinglethreadexecutor()

newcachedthreadpool

public

static executorservice newcachedthreadpool()

可以看出這三種建立執行緒池的方法底層都是呼叫threadpoolexecutor

我們知道上面不管是建立固定數的執行緒,還是可變執行緒底層實際上都是呼叫的threadpoolexecutor,而呼叫threadpoolexecutor肯定得傳參,接下來我們就聊聊它們引數的各自含義

7大引數

public

threadpoolexecutor

(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueue

workqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

網上找了一張

從上面通過executors呼叫的不管是newsinglethreadexecutor,還是newfixedthreadpool,底層呼叫threadpoolexecutor時候引數都是系統預設的,就newcachedthreadpool舉例,允許的建立執行緒數量為integer.max_value,可能導致堆積大量的執行緒從而導致oom

或者newfixedthreadpool,允許最大請求佇列長度為integer.max_value,可能導致堆積大量請求,導致oom

所以盡量自己定義執行緒池

如下

executorservice threadpool=

newthreadpoolexecutor

(//corepoolsize2,

//maximumpoolsize5,

//keepalivetime

2l,//unit

timeunit.seconds,

//workqueue

newlinkedblockingdeque

(5),

//threadfactory

executors.

defaultthreadfactory()

,//handler

newthreadpoolexecutor.abortpolicy()

);

執行緒最多容量數:workqueue+maximumpoolsize

例子:和之前一樣只不過自己手動建立的執行緒池

public

class

mythreadpool);

}}catch

(exception e)

finally

}}

結果

只有8個執行緒執行。因為lz設定的workqueue(3)+maximumpoolsize(5)=8

執行緒池7大引數深入介紹

1.corepoolsize 執行緒池中的常駐核心執行緒數 1 在建立了執行緒池後,當有請求任務來之後,就會安排池中的執行緒去執行請求任務,近似理解為今日當值執行緒 2 當執行緒池中的執行緒數目達到corepoolsize後,就會把到達的任務放到快取佇列當中 2.maximumpoolsize 執行...

執行緒池 3大方法 7大引數 4種拒絕策略

執行緒池 3大方法 7大引數 4種拒絕策略 池化技術 程式的執行,本質 占用系統的資源 優化資源的使用 池化技術。執行緒池 連線池 記憶體池 物件池 建立 銷毀。十分浪費資源 池化技術 事先準備好一些資源,有人要用,就來我這裡拿,用完還給我 執行緒池的好處 1 降低資源的消耗 2 提高響應的速度 3...

執行緒池七大引數介紹

executorservice threadpool executors.newfixedthreadpool 5 public static executorservice newfixedthreadpool int nthreads public threadpoolexecutor int ...