首先, 當有乙個新的任務加入到執行緒池的任務佇列中時, 執行緒池會先判斷當前執行緒數是否小於核心執行緒數, 如果小於, 這執行緒池會建立乙個新的執行緒
如果當前執行緒數大於或等於核心執行緒數, 則會將這個新的任務加入到阻塞佇列中
這時如果任務的不斷加入導致阻塞佇列滿了, 則執行緒池又會建立乙個新的臨時執行緒, 處理阻塞佇列中的任務
如果處理完阻塞佇列中的任務, 臨時執行緒等待的時間超過空閒執行緒的存活時間, 執行緒池就會銷毀臨時執行緒
如果新的任務進來, 建立的臨時執行緒加上核心執行緒數達到最大執行緒數, 而這時阻塞佇列又是滿的, 執行緒池就會根據拒絕策略拒絕任務
執行緒池的拒絕策略executorservice threadpool = new threadpoolexecutor(
2, //核心執行緒數
5, //最大執行緒數
1l, //空閒執行緒存活時間
timeunit.seconds, //存活時間單位
new linkedblockingqueue<>(3), //阻塞佇列
executors.defaultthreadfactory(), //建立執行緒的工廠類
new threadpoolexecutor.callerrunspolicy() //拒絕策略
);
abortpolicy:預設的策略,直接丟擲rejectedexecutionexception
異常,阻止系統正常執行。
callerrunspolicy:既不會丟擲異常,也不會終止任務,而是將任務返回給呼叫者。
discardoldestpolicy:拋棄佇列中等待最久的任務,然後把當前任務加入佇列中嘗試再次提交任務。
discardpolicy:直接丟棄任務,不做任何處理。
執行緒池工作原理
執行緒池狀態的切換 執行緒池關鍵類的uml圖 執行緒池就是把任務提交和任務執行解耦。首先看一下執行緒池的使用 public static void main string args throws interruptedexception 2,提交任務 es.shutdown 3,執行緒池關閉 跟進原...
執行緒池的工作原理
1 當提交乙個新任務到執行緒池時首先執行緒池判斷核心執行緒池 corepoolsize 是否已滿?沒滿,建立乙個工作執行緒來執行任務。滿了,則判斷工作佇列 workqueue 是否已滿?沒滿,則將新提交的任務儲存在工作佇列裡。滿了,則判斷最大執行緒池 maximumpoolsize 是否已滿?沒滿,...
什麼是執行緒池?執行緒池的工作原理和使用執行緒池的好處
乙個執行緒池管理了一組工作執行緒,同時它還包括了乙個用於放置等待執行任務的任務佇列 阻塞佇列 預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0.當任務提交給執行緒池之後的處理策略如下 1 如果此時執行緒池中的數量小於corepoolsize 核心池的大小 即使執行緒池中的執行緒都處於空閒狀態...