日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程池的拒绝策略

發布時間:2024/3/12 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程池的拒绝策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

四種線程池拒絕策略


當線程池的任務緩存隊列已滿并且線程池中的線程數目達到maximumPoolSize時,如果還有任務到來就會采取任務拒絕策略,通常有以下四種策略:
ThreadPoolExecutor.AbortPolicy:丟棄任務并拋出RejectedExecutionException異常。 ThreadPoolExecutor.DiscardPolicy:丟棄任務,但是不拋出異常。 ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然后重新提交被拒絕的任務 ThreadPoolExecutor.CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務

(1)AbortPolicy
AbortPolicy

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

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

(2)DiscardPolicy

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

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

(3)DiscardOldestPolicy

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

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

(4)CallerRunsPolicy

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

?線程池中,有三個重要的參數,決定影響了拒絕策略:

  • corePoolSize - 核心線程數,也即最小的線程數。

  • workQueue - 阻塞隊列 。
  • maximumPoolSize - 最大線程數
  • ????????當提交任務數大于 corePoolSize 的時候,會優先將任務放到 workQueue 阻塞隊列中。當阻塞隊列飽和后,會擴充線程池中線程數,直到達到 maximumPoolSize 最大線程數配置。此時,再多余的任務,則會觸發線程池的拒絕策略了。總結起來,也就是一句話,當提交的任務數大于(workQueue.size() + maximumPoolSize ),就會觸發線程池的拒絕策略。

    我們知道四種拒絕策略是相互獨立的,選擇何種策略去執行,還得結合具體的業務場景。實際工作中,一般直接使用 ExecutorService 的時候,都是使用的默認的 defaultHandler 即?AbortPolicy?策略。

    總結

    以上是生活随笔為你收集整理的线程池的拒绝策略的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。