參數明細 查看大圖 ThreadPoolExecutor執行順序: 線程池按以下行為執行任務 當線程數小於核心線程數時,創建線程。 當線程數大於等於核心線程數,且任務隊列未滿時,將任務放入任務隊列。 當線程數大於等於核心線程數,且任務隊列已滿 若線程數小於最大線程數,創建線程 若線程數等於最大線程數 ...
參數明細
ThreadPoolExecutor執行順序: 線程池按以下行為執行任務- 當線程數小於核心線程數時,創建線程。
- 當線程數大於等於核心線程數,且任務隊列未滿時,將任務放入任務隊列。
- 當線程數大於等於核心線程數,且任務隊列已滿
- 若線程數小於最大線程數,創建線程
- 若線程數等於最大線程數,拋出異常,拒絕任務
- 預設值
-
- corePoolSize=1
- queueCapacity=Integer.MAX_VALUE
- maxPoolSize=Integer.MAX_VALUE
- keepAliveTime=60s
- allowCoreThreadTimeout=false
- rejectedExecutionHandler=AbortPolicy()
- 如何來設置
-
- 需要根據幾個值來決定
-
- tasks :每秒的任務數,假設為500~1000
- taskcost:每個任務花費時間,假設為0.1s
- responsetime:系統允許容忍的最大響應時間,假設為1s
- 做幾個計算
-
- corePoolSize = 每秒需要多少個線程處理?
-
- threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 個線程。corePoolSize設置應該大於50
- 根據8020原則,如果80%的每秒任務數小於800,那麼corePoolSize設置為80即可
- queueCapacity = (coreSizePool/taskcost)*responsetime
-
- 計算可得 queueCapacity = 80/0.1*1 = 80。意思是隊列里的線程可以等待1s,超過了的需要新開線程來執行
- 切記不能設置為Integer.MAX_VALUE,這樣隊列會很大,線程數只會保持在corePoolSize大小,當任務陡增時,不能新開線程來執行,響應時間會隨之陡增。
- maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)
-
- 計算可得 maxPoolSize = (1000-80)/10 = 92
- (最大任務數-隊列容量)/每個線程每秒處理能力 = 最大線程數
- rejectedExecutionHandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩衝機制來處理
- keepAliveTime和allowCoreThreadTimeout採用預設通常能滿足