當線程池的任務緩存隊列已滿並且線程池中的線程數目達到maximumPoolSize時,如果還有任務到來就會采取任務拒絕策略,通常有以下四種策略:
AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。
這是線程池默認的拒絕策略,在任務不能再提交的時候,拋出異常,及時反饋程序運行狀態。如果是比較關鍵的業務,推薦使用此拒絕策略,這樣子在系統不能承載更大的並發量的時候,能夠及時的通過異常發現。
DiscardPolicy:丟棄任務,但是不拋出異常。 如果線程隊列已滿,則后續提交的任務都會被丟棄,且是靜默丟棄。
DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新提交被拒絕的任務
CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務,
我在做短信平台的項目中,線程池就是采用了該種拒絕策略,因為我們的短信一條都不能漏發,所以每個任務必須處理。
當然,要做到完全不丟棄任務,還是要根據實際的線上業務量,合理配置線程池參數,比如核心線程數、最大線程數、任務隊列長度等,保證線程池能夠及時有效處理任務,這樣才能夠不丟棄任務。
用戶還可以自定義拒絕策略:實現RejectExecutionHandler接口,實現rejectedExecution方法,自定義策略模式。
具體使用哪種策略,還得根據實際業務場景才能做出抉擇。