线程池的拒绝策略
四種線程池拒絕策略
當線程池的任務(wù)緩存隊列已滿并且線程池中的線程數(shù)目達到maximumPoolSize時,如果還有任務(wù)到來就會采取任務(wù)拒絕策略,通常有以下四種策略:
ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常。 ThreadPoolExecutor.DiscardPolicy:丟棄任務(wù),但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務(wù),然后重新提交被拒絕的任務(wù) ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程(提交任務(wù)的線程)處理該任務(wù)
(1)AbortPolicy
AbortPolicy
ThreadPoolExecutor.AbortPolicy:丟棄任務(wù)并拋出RejectedExecutionException異常。
這是線程池默認的拒絕策略,在任務(wù)不能再提交的時候,拋出異常,及時反饋程序運行狀態(tài)。如果是比較關(guān)鍵的業(yè)務(wù),推薦使用此拒絕策略,這樣子在系統(tǒng)不能承載更大的并發(fā)量的時候,能夠及時的通過異常發(fā)現(xiàn)。
(2)DiscardPolicy
ThreadPoolExecutor.DiscardPolicy:丟棄任務(wù),但是不拋出異常。如果線程隊列已滿,則后續(xù)提交的任務(wù)都會被丟棄,且是靜默丟棄。
使用此策略,可能會使我們無法發(fā)現(xiàn)系統(tǒng)的異常狀態(tài)。建議是一些無關(guān)緊要的業(yè)務(wù)采用此策略。例如,本人的博客網(wǎng)站統(tǒng)計閱讀量就是采用的這種拒絕策略。
(3)DiscardOldestPolicy
ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務(wù),然后重新提交被拒絕的任務(wù)。
此拒絕策略,是一種喜新厭舊的拒絕策略。是否要采用此種拒絕策略,還得根據(jù)實際業(yè)務(wù)是否允許丟棄老任務(wù)來認真衡量。
(4)CallerRunsPolicy
ThreadPoolExecutor.CallerRunsPolicy:由調(diào)用線程處理該任務(wù)
?線程池中,有三個重要的參數(shù),決定影響了拒絕策略:
corePoolSize - 核心線程數(shù),也即最小的線程數(shù)。
????????當提交任務(wù)數(shù)大于 corePoolSize 的時候,會優(yōu)先將任務(wù)放到 workQueue 阻塞隊列中。當阻塞隊列飽和后,會擴充線程池中線程數(shù),直到達到 maximumPoolSize 最大線程數(shù)配置。此時,再多余的任務(wù),則會觸發(fā)線程池的拒絕策略了。總結(jié)起來,也就是一句話,當提交的任務(wù)數(shù)大于(workQueue.size() + maximumPoolSize ),就會觸發(fā)線程池的拒絕策略。
我們知道四種拒絕策略是相互獨立的,選擇何種策略去執(zhí)行,還得結(jié)合具體的業(yè)務(wù)場景。實際工作中,一般直接使用 ExecutorService 的時候,都是使用的默認的 defaultHandler 即?AbortPolicy?策略。
總結(jié)
- 上一篇: 班级文化建设计算机专业,云计算背景下计算
- 下一篇: 全栈工程师眼中的HTTP