面試連環炮系列(十六):線程池的使用場景有哪些


  1. 線程池的使用場景有哪些
    線程池適合單系統的大量的異步任務處理,比如發送短信、保存日志。

  2. 說說創建線程池的重要參數

    • corePoolSize:線程池的大小。線程池創建之后不會立即去創建線程,而是等待線程的到來。當前執行的線程數大於該值時,線程會加入到緩沖隊列。
    • maximumPoolSize:線程池中創建的最大線程數。
    • keepAliveTime:空閑的線程多久時間后被銷毀。默認情況下,該值在線程數大於corePoolSize時,對超出corePoolSize值的這些線程起作用。
    • unit:TimeUnit枚舉類型的值,代表keepAliveTime時間單位。
    • handler:線程拒絕策略。
  3. 這些參數怎么設置,線程池調優怎么做

  • 基本思想:

    1. 高並發、任務執行時間短的業務,線程池線程數可以設置為CPU核數+1,減少線程上下文的切換。
    2. 並發不高、任務執行時間長的業務要區分開:
      1. IO密集型的任務,因為IO操作並不占用CPU,可以加大線程池中的線程數目,讓CPU處理更多的業務
      2. CPU密集型任務,線程池中的線程數設置得少一些,減少線程上下文的切換。
    3. 並發高、業務執行時間長,在於整體架構的設計,能否使用中間件對任務進行拆分和解耦。
  • 具體設置:

    1. corePoolSize = 每秒需要多少個線程處理
      threadcount = tasks/(1/taskcost) =taskstaskcout =  (500~1000)0.1 = 50~100 個線程。corePoolSize設置應該大於50。根據8020原則,如果80%的每秒任務數小於800,那么corePoolSize設置為80即可。
    2. queueCapacity = (coreSizePool/taskcost) * responsetime
      計算可得 queueCapacity = 80/0.1*1 = 80,意思是隊列里的線程可以等待1s,超過了的需要新開線程來執行。切記不能設置為Integer.MAX_VALUE,這樣隊列會很大,線程數只會保持在corePoolSize大小,當任務陡增時,不能新開線程來執行,響應時間會隨之陡增。
    3. maxPoolSize = (max(tasks)- queueCapacity)/(1/taskcost)(最大任務數-隊列容量)/每個線程每秒處理能力 = 最大線程數。計算可得 maxPoolSize = (1000-80)/10 = 92。
    4. rejectedExecutionHandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩沖機制來處理。
    5. keepAliveTime和allowCoreThreadTimeout:采用默認能滿足。

參考(摘抄的文字版權屬於原作者):

https://blog.csdn.net/qq_17045385/article/details/79820847
https://www.cnblogs.com/owenma/p/8557074.html
https://www.jianshu.com/p/71b5e40f94e0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM