線程池的拒絕策略


在創建線程池時我們可以指定自己的拒絕策略,如下

 

 

什么時候會觸發拒絕策略

  1. 當我們調用 shutdown 等方法關閉線程池后,如果再向線程池內提交任務,就會遭到拒絕。

  2. 線程池沒有空閑線程(線程池的線程達到了最大線程數,並且都在執行任務)並且隊列已經滿了,不能在存放任務了。

 

拒絕策略

ThreadPoolExecutor 類有4 種默認的拒絕策略

AbortPolicy

這種拒絕策略在拒絕任務時,會直接拋出一個類型為 RejectedExecutionException 的 RuntimeException,讓你感知到任務被拒絕了,於是你便可以根據業務邏輯選擇重試或者放棄提交等策略。

DiscardPolicy

當有新任務被提交后直接被丟棄掉,也不會給你任何的通知,相對而言存在一定的風險,因為我們提交的時候根本不知道這個任務會被丟棄,可能造成數據丟失。

DiscardOldestPolicy

丟棄任務隊列中的頭結點,通常是存活時間最長的任務,它也存在一定的數據丟失風險。

CallerRunsPolicy

第四種拒絕策略是 ,相對而言它就比較完善了,當有新任務提交后,如果線程池沒被關閉且沒有能力執行,則把這個任務交於提交任務的線程執行,也就是誰提交任務,誰就負責執行任務。這樣做主要有兩點好處。

第一點新提交的任務不會被丟棄,這樣也就不會造成業務損失。 第二點好處是,由於誰提交任務誰就要負責執行任務,這樣提交任務的線程就得負責執行任務,而執行任務又是比較耗時的,在這段期間,提交任務的線程被占用,也就不會再提交新的任務,減緩了任務提交的速度,相當於是一個負反饋。在此期間,線程池中的線程也可以充分利用這段時間來執行掉一部分任務,騰出一定的空間,相當於是給了線程池一定的緩沖期。

自定義拒絕策略

實現 RejectedExecutionHandler 接口來實現自己的拒絕策略,如代碼所示:


免責聲明!

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



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