利用執行緒池能夠帶來三個好處:
第一:降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。
第二:提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。
第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。但是要做到合理的利用執行緒池。
public threadpoolexecutor(int corepoolsize,int maximumpoolsize,long keepalivetime,
timeunit unit,blockingqueueworkqueue,
threadfactory threadfactory,rejectedexecutionhandler handler)
1、corepoolsize:執行緒池的核心執行緒數量
2、maximumpoolsize:執行緒池中允許的最大執行緒數量
4、timeunit unit:keepalivetime的單位
5、workqueue:workqueue必須是blockingqueue阻塞佇列。當執行緒池中的執行緒數超過它的corepoolsize的時候,執行緒會進入阻塞佇列進行阻塞等待。
6、threadfactory:建立執行緒的工廠
7、rejectedexecutionhandler:飽和策略
執行緒池的飽和策略,當阻塞佇列滿了,且沒有空閒的工作執行緒,如果繼續提交任務,必須採取一種策略處理該任務,執行緒池提供了4種策略:
(1)abortpolicy:直接丟擲異常,預設策略;
(2)callerrunspolicy:用呼叫者所在的執行緒來執行任務;
(3)discardoldestpolicy:丟棄阻塞佇列中靠最前的任務,並執行當前任務;
(4)discardpolicy:直接丟棄任務;
(1)如果執行緒池中的執行緒數量少於corepoolsize,就建立新的執行緒來執行新新增的任務;
(2)如果執行緒池中的執行緒數量大於等於corepoolsize,但佇列workqueue未滿,則將新新增的任務放到workqueue中,按照fifo的原則依次等待執行(執行緒池中有執行緒空閒出來後依次將佇列中的任務交付給空閒的執行緒執行);
(3)如果執行緒池中的執行緒數量大於等於corepoolsize,且佇列workqueue已滿,但執行緒池中的執行緒數量小於maximumpoolsize,則會建立新的執行緒來處理被新增的任務;
(4)如果執行緒池中的執行緒數量等於了maximumpoolsize,就用rejectedexecutionhandler來做拒絕處理
總結,當有新的任務要處理時,先看執行緒池中的執行緒數量是否大於corepoolsize,再看緩衝佇列workqueue是否滿,最後看執行緒池中的執行緒數量是否大於maximumpoolsize
執行緒池框架提供了兩種方式提交任務,根據不同的業務需求選擇不同的方式。
1、通過executor.execute()方法提交的任務,必須實現runnable介面,該方式提交的任務不能獲取返回值,因此無法判斷任務是否執行成功。
2、通過executorservice.submit()方法提交的任務,可以獲取任務執行完的返回值。
執行緒池原理剖析
前面的我那幾個原始碼截圖,大家可以自己點進去看看,共同點都是封裝了 threadpoolexcutor這建構函式 無非就是傳遞的引數不一樣 比如 singlethreadexecutor public static executorservice newsinglethreadexecutor 就是...
執行緒池剖析
public final class threadpool 建立執行緒池,worker num為執行緒池中工作執行緒的個數 private threadpool int worker num 單態模式,獲得乙個預設執行緒個數的執行緒池 public static threadpool getthre...
執行緒池1 執行緒池原理
執行緒池可以看做容納執行緒的容器 乙個應用程式最多只能有乙個執行緒池 threadpool靜態類通過queueuserworkitem 方法將工作函式排入執行緒池 每排入乙個工作函式,就相當於請求建立乙個執行緒 執行緒池的作用 執行緒池是為突然大量爆發的執行緒設計的,通過有限的幾個固定執行緒為大量的...