自定義執行緒池,如何最佳建立執行緒池

2022-09-17 15:36:29 字數 1694 閱讀 8975

j**a有預置執行緒池:newsinglethreadexecutor,newfixedthreadpool,newcacheedthreadpool,newscheduledthreadpool,newworkstealingpool。如果不適合,還可以使用threadpoolexecutor建立自定義執行緒池。主要構造方法:

1

public threadpoolexecutor(int

corepoolsize,

2int

maximumpoolsize,

3long

keepalivetime,

4timeunit unit,

5 blockingqueueworkqueue)67

public threadpoolexecutor(int

corepoolsize,

8int

maximumpoolsize,

9long

keepalivetime,

10timeunit unit,

11 blockingqueueworkqueue,

12threadfactory threadfactory,

13 rejectedexecutionhandler handler)

我們接下來介紹引數,其中執行緒池大小與前四個引數有關。

maximumpoolsize:最大執行緒數。如上面情況,如果當前執行緒超過corepoolsize,先嘗試排隊,如果佇列滿了或者其他情況不能入隊,那麼它不會排隊,而是檢查執行緒數是否達到maximumpoolsize,如果沒有,就建立執行緒,直到執行緒數達到maximumpoolsize。

keepalivetime:空閒執行緒存活時間。當執行緒池的執行緒數大於corepoolsize,額外空閒執行緒的存活時間。如果到了時間,還沒有新任務,就會釋放執行緒。值為0,表示執行緒不會超時釋放。

unit

blockingqueue:阻塞佇列。可以使用linkedblockingqueue(預設無界)、arrayblockingqueue、priorityblockingqueue(無界)、synchronousqueue(沒實際儲存空間)。使用無界佇列,需要注意,執行緒數最多達到corepoolsize,新任務來只能排隊,maximumpoolsize沒意義。synchronousqueue只有正好有空閒執行緒,才會入隊成功,否則總是建立新執行緒,直到達到maximumpoolsize。

handler:任務拒絕策略。有界佇列,執行緒數達到maximumpoolsize,佇列滿了,觸發任務拒絕策略。四種處理方式:abortpolicy(預設,丟擲異常),discardpolicy(忽略新任務,不拋異常),discardoldestpolicy(扔掉等待時間最長,自己排隊),callerrunspolicy(任務提交者執行緒執行任務)

最佳自定義建立執行緒池,佇列有界,maximumpoolsize有限,使用任務拒絕策略。

如果佇列無界,服務不了的任務總是會排隊,消耗記憶體,甚至引發記憶體不足異常。如果佇列有界但maximumpoolsize無線,可能會建立過多執行緒,佔記憶體和cpu。

建立自定義執行緒池

1.建立乙個單例模式的自定義執行緒池類 public class customthreadpool public static customthreadpool instance endregion private void initializethreadpool 2.定義一些基本型別來和執行緒池...

自定義執行緒池

有些時候 jdk自帶的cachedthreadpool fixedthreadpool等執行緒池完成不了我們業務的需求時 可以用threadpoolexecutorg構造自定義的執行緒池。public class usethreadpoolexecutor1 這段 會首先執行任務1,然後把2 3 4...

自定義執行緒池

建立執行緒池方法 儘管executors提供了四種執行緒池建立的方式,但為了實現某些特定的需求,可以自己建立執行緒池。如在阿里的程式設計規範使用executors建立執行緒時,一般會報錯,並提示以下資訊 執行緒池不允許使用executors去建立,而是通過threadpoolexecutor的方式,...