JAVA線程池使用注意事項


線程池中重要的配置

  • corePoolSize : 核心線程數量
  • workQueue : 等待隊列
  • maximumPoolSize : 最大線程數量

提交任務時,判斷的順序為 corePoolSize --> workQueue -->maximumPoolSize

當線程數小於核心線程數時,創建核心線程

當線程大於等於核心線程數,且任務隊列未滿時,將任務放入隊列

當線程數大於核心線程數,且任務隊列已滿時,檢查最大線程數是否已滿,若未滿,創建非核心線程,若滿,根據拒絕策略拋出異常拒絕任務。

 

拒絕策略—RejectedExecutionHandler

  • AbortPolicy : 直接拋出異常,這是默認策略
  • CallerRunsPolicy : 用調用者所在線程來執行任務
  • DiscardOldestPolicy : 丟棄阻塞隊列中最靠前的任務,並執行當前任務
  • DiscardPolicy : 直接丟棄任務

 

遇到的坑!!!

  • 任務提交后長時間沒有執行

   1.任務進入了隊列,線程還在執行之前的任務。提交的任務還在排隊等待執行中

  • 線程執行任務中無故消失

          1.  線程拒絕策略配置為CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy時 ,線程池滿了不會拋出異常。建議將拒絕策略配置為AbortPolicy

          2.  一般情況下,代碼只會去捕捉Exception,如果拋出Error(比如內存溢出)則會導致線程退出,而異常信息又沒有拿到。最佳的解決辦法是給線程池設置UncaughtExceptionHandler

 

 

 

參考地址

Java線程池使用的注意事項 https://www.jianshu.com/p/340f23001a65

 


免責聲明!

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



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