ThreadPoolExecutor執行原理

2021-10-06 00:00:45 字數 2934 閱讀 6037

基本概念:一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。

不要使用executor建立執行緒池,而是通過threadpoolexecutor的方式建立,這樣的處理方式能讓編寫**的人更加明確執行緒池的執行規則,規避資源耗盡的風險。

說明:executors 返回的執行緒池物件的弊端如下:

1)fixedthreadpool和singlethreadpool:

允許請求的佇列長度為interger.max_value,可能會堆積大量的請求,從而導致oom。

2)cachedthreadpool:

允許的建立執行緒數量為:interger.max_value,可能會建立大量的執行緒,從而導致oom。

//executor不建議使用,容易引發oom

executorservice threadpool = executors.

newsinglethreadexecutor()

;//單執行緒

executorservice threadpool1 = executors.

newfixedthreadpool(5

);//固定執行緒

executorservice threadpool2 = executors.

newcachedthreadpool()

;//可變執行緒

for(

int i =

0; i <

10; i++))

;}

核心執行緒數,最大執行緒數,超時等待時間,超時等待單位,阻塞佇列,執行緒工廠,拒絕策略。

public

threadpoolexecutor

(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueue

workqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

執行過程:如果執行緒數沒有超過核心執行緒數,那麼就會用到幾個開闢幾個,如果大於核心執行緒數,但是沒有超過阻塞佇列的個數,那麼就會等待核心執行緒執行完,再取阻塞佇列中的執行

測試**

threadpoolexecutor threadpoolexecutor =

newthreadpoolexecutor(2

,6,3

, timeunit.seconds,

newarrayblockingqueue

<

>(3

),executors.

defaultthreadfactory()

,new

threadpoolexecutor.abortpolicy()

);trycatch

(interruptedexception e)})

;}}catch

(exception e)

finally

調整不同的迴圈數會出現不同的執行順序,甚至會報錯,具體是什麼原理呢?下面用畫圖的方式描述出來。

以核心執行緒數為2,最大執行緒數為6,阻塞佇列容量為3 為例:

如圖,藍色為待執行的任務,黃色為核心執行緒,當要執行的任務數小於等於核心執行緒數時,直接被核心執行緒接管:

task1,task2被核心執行緒接管,task3進阻塞佇列等待核心執行緒執行完畢再執行。

因為阻塞佇列已達到最大容量,剩餘的執行緒(除去核心執行緒的其他執行緒)會被啟動,用來直接接管新來的任務,當執行緒經過keepalivetime還沒有接到任務,則再次關閉執行緒。

注意:直接接管新來的任務,而不是從阻塞佇列中取

超出數量的任務會被拒絕,具體的拒絕策略有四種:

因為是主線程呼叫的,所以會被主線程接管。

​ 可以看出當迴圈次數為10時,只執行了9個,多出的任務被丟棄。

ThreadPoolExecutor使用小結

記錄一下那幾個引數的理解,網上說了亂七八糟,詳細看參考文件,很詳細很明白,沒什麼好說的。corepoolsize,maximumpoolsize,keepalivetime keepalivetime workqueue queue blocksize 執行執行緒後,會判斷數量是否超出corepoo...

ThreadPoolExecutor簡單介紹

在專案中如果使用發簡訊這個功能,一般會把發簡訊這個動作變成非同步的,因為大部分情況下,簡訊到底是傳送成功或者失敗,都不能影響主流程。當然像傳送mq訊息等操作也是可以封裝成非同步操作的。如果想乙個操作變成非同步的,可以直接new thread,然後在run方法中實現業務操作即可。例如 new thre...

ThreadPoolExecutor執行緒池原始碼解讀

主要變數 private volatile int corepoolsize private volatile int maximumpoolsize private volatile int poolsize 建構函式 也就是建立類的時候,需要注入引數。public threadpoolexecu...