線程池的4種拒絕策略


1.ThreadPoolExecutor類實現了ExecutorService接口和Executor接口,可以設置線程池corePoolSize,最大線程池大小,AliveTime,拒絕策略等。常用構造方法
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,BlockingQueue workQueue,
RejectedExecutionHandler handler )

corePoolSize: 線程池維護線程的最少數量
maximumPoolSize:線程池維護線程的最大數量
keepAliveTime: 線程池維護線程所允許的空閑時間
(解釋:當線程池的數量超過corePoolSize時,多余的空閑線程的存活時間。)
unit: 線程池維護線程所允許的空閑時間的單位
workQueue: 線程池所使用的緩沖隊列
handler: 線程池對拒絕任務的處理策略

在這里插入圖片描述
handler有四個選擇:

策略1:ThreadPoolExecutor.AbortPolicy()
拋出java.util. concurrent .RejectedExecutionException異常 ,示例如下:
在這里插入圖片描述
小疑問:筆者對運行結果還是有一些疑問,為什么異常在下面第3行就出現了
在這里插入圖片描述

策略2:ThreadPoolExecutor.CallerRunsPolicy
用於被拒絕任務的處理程序,它直接在 execute 方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務。如下:(小疑問:筆者對運行結果還是有很多的疑問,比如pool-1-thread-7 is running連續出現了好多次,這是為什么呢?)
在這里插入圖片描述
解釋:上面zxai
策略3:RejectedExecutionHandler handler =
new ThreadPoolExecutor.DiscardOldestPolicy();
這樣運行結果就不會有100個線程全部被執行。處理源碼如下:
Java中Queue的一些常用方法:
poll() 移除並返問隊列頭部的元素
在這里插入圖片描述
解釋:該策略將丟棄最老的一個請求,也就是即將被執行的一個任務,並嘗試再次提交當前任務。(問:為什么是彈出隊列的頭元素呢?答:是因為隊列的先進先出原則,所以隊列的頭元素肯定是最老的一個請求,而DiscardOldestPolicy策略就是把最老的請求廢除,把這個機會(相當於搶了最老的請求的吃到嘴邊的肉)留給當前新提交到線程池里面的線程(這個時候線程池已經滿了,隊列也已經滿了,如果不滿的話,也不會有拒絕策略了!))

策略4:ThreadPoolExecutor.DiscardPolicy
用於被拒絕任務的處理程序,默認情況下它將丟棄被拒絕的任務。
運行結果也不會全部執行100個線程。
源碼如下,實際就是對線程不執行操作:
在這里插入圖片描述
在這里插入圖片描述

原文地址:https://blog.csdn.net/qq_40241957/article/details/85468994
                                </div>


免責聲明!

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



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