-
線程池的使用場景有哪些
線程池適合單系統的大量的異步任務處理,比如發送短信、保存日志。 -
說說創建線程池的重要參數
- 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