JAVA線程池的拒絕策略有哪幾種?


當線程池的任務緩存隊列已滿並且線程池中的線程數目達到maximumPoolSize時,如果還有任務到來就會采取任務拒絕策略,通常有以下四種策略:

AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。

這是線程池默認的拒絕策略,在任務不能再提交的時候,拋出異常,及時反饋程序運行狀態。如果是比較關鍵的業務,推薦使用此拒絕策略,這樣子在系統不能承載更大的並發量的時候,能夠及時的通過異常發現。

DiscardPolicy:丟棄任務,但是不拋出異常。 如果線程隊列已滿,則后續提交的任務都會被丟棄,且是靜默丟棄。

DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新提交被拒絕的任務

CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務,

我在做短信平台的項目中,線程池就是采用了該種拒絕策略,因為我們的短信一條都不能漏發,所以每個任務必須處理。

當然,要做到完全不丟棄任務,還是要根據實際的線上業務量,合理配置線程池參數,比如核心線程數、最大線程數、任務隊列長度等,保證線程池能夠及時有效處理任務,這樣才能夠不丟棄任務。

用戶還可以自定義拒絕策略:實現RejectExecutionHandler接口,實現rejectedExecution方法,自定義策略模式。

具體使用哪種策略,還得根據實際業務場景才能做出抉擇。


免責聲明!

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



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