-
執行緒池的使用場景有哪些
執行緒池適合單系統的大量的異步任務處理,比如發送短信、保存日志, -
說說創建執行緒池的重要引數
- corePoolSize:執行緒池的大小,執行緒池創建之后不會立即去創建執行緒,而是等待執行緒的到來,當前執行的執行緒數大于該值時,執行緒會加入到緩沖佇列,
- maximumPoolSize:執行緒池中創建的最大執行緒數,
- keepAliveTime:空閑的執行緒多久時間后被銷毀,默認情況下,該值在執行緒數大于corePoolSize時,對超出corePoolSize值的這些執行緒起作用,
- unit:TimeUnit列舉型別的值,代表keepAliveTime時間單位,
- handler:執行緒拒絕策略,
-
這些引數怎么設定,執行緒池調優怎么做
-
基本思想:
- 高并發、任務執行時間短的業務,執行緒池執行緒數可以設定為CPU核數+1,減少執行緒背景關系的切換,
- 并發不高、任務執行時間長的業務要區分開:
- IO密集型的任務,因為IO操作并不占用CPU,可以加大執行緒池中的執行緒數目,讓CPU處理更多的業務
- CPU密集型任務,執行緒池中的執行緒數設定得少一些,減少執行緒背景關系的切換,
- 并發高、業務執行時間長,在于整體架構的設計,能否使用中間件對任務進行拆分和解耦,
-
具體設定:
- corePoolSize = 每秒需要多少個執行緒處理
threadcount = tasks/(1/taskcost) =taskstaskcout = (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:采用默認能滿足,
- corePoolSize = 每秒需要多少個執行緒處理
參考(摘抄的文字著作權屬于原作者):
https://blog.csdn.net/qq_17045385/article/details/79820847
https://www.cnblogs.com/owenma/p/8557074.html
https://www.jianshu.com/p/71b5e40f94e0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10537.html
標籤:其他
上一篇:全國大陸電話區號以及號碼分布
下一篇:VoIP性能測驗工具輯一下載
