為什麼需要自己定義執行緒池
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 ...