1. 程式人生 > >ThreadPoolExecutor執行緒池引數設定技巧

ThreadPoolExecutor執行緒池引數設定技巧

  • 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採用預設通常能滿足