線程池中重要的配置
- 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