10秒搞定4種線程池拒絕策略

四種線程池拒絕策略

當線程池的任務緩存隊列已滿而且線程池中的線程數目達到maximumPoolSize時,java

若是還有任務到來就會採起任務拒絕策略,一般有如下四種策略:
ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。 sql

ThreadPoolExecutor.DiscardPolicy:丟棄任務,可是不拋出異常。 緩存

ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,而後從新提交被拒絕的任務 併發

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

 

線程池的默認拒絕策略爲AbortPolicy,即丟棄任務並拋出RejectedExecutionException異常網站

拒絕策略場景分析

(1)AbortPolicy
AbortPolicyui

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

A handler for rejected tasks that throws a {@code RejectedExecutionException}.

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

(2)DiscardPolicycode

ThreadPoolExecutor.DiscardPolicy:丟棄任務,可是不拋出異常。若是線程隊列已滿,則後續提交的任務都會被丟棄,且是靜默丟棄。

A handler for rejected tasks that silently discards therejected task. 

使用此策略,可能會使咱們沒法發現系統的異常狀態。建議是一些可有可無的業務採用此策略。例如,本人的博客網站統計閱讀量就是採用的這種拒絕策略。

(3)DiscardOldestPolicy

ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,而後從新提交被拒絕的任務。

A handler for rejected tasks that discards the oldest unhandled request and then retries {@code execute}, unless the executor is shut down, in which case the task is discarded.

此拒絕策略,是一種喜新厭舊的拒絕策略。是否要採用此種拒絕策略,還得根據實際業務是否容許丟棄老任務來認真衡量。

(4)CallerRunsPolicy

ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務

  1.  
    A handler for rejected tasks that runs the rejected task directly in the calling thread of the {@code execute} method, unless the executor has been shut down, in which case the task is discarded.
  2.  
     

若是任務被拒絕了,則由調用線程(提交任務的線程)直接執行此任務

相關文章
相關標籤/搜索