基本概念:一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。
不要使用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...