1. 為什麼有執行緒池?
既然是乙個存放執行緒的池子,那麼,執行緒池的工作要務肯定就是控制管理執行的執行緒啦。既然要**原理,我們肯定得從原始碼說起了。我們先來介紹一下四個常見的執行緒池
四個基本執行緒池
建立單個執行緒:executors.newsinglethreadexecutor()
public static executorservice newsinglethreadexecutor(threadfactory threadfactory)
public static executorservice newcachedthreadpool()
建立固定數量的執行緒池:executors.newfixedthreadpool()
public static executorservice newfixedthreadpool(int nthreads)
建立定期執行,定時執行緒:executors.newscheduledthreadpool()
public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)
通過觀察四個執行緒池的建立**,我們可以發現,執行緒池的建立都是基於乙個類:threadpoolexecutor,只是傳入的引數各異。我們通過原始碼來看一下這個類是怎樣建立執行緒池的。
其中乙個建構函式
public threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
threadfactory threadfactory,
rejectedexecutionhandler handler)
corepoolsize:執行緒池核心執行緒數量
maximumpoolsize:執行緒池所允許的最大執行緒數量
keepalivetime:指定了空閒執行緒的存活時間
unit:時間的單位(秒、毫秒)
workqueue:任務佇列,等待執行緒執行
handler :執行緒池的拒絕策略(當執行緒數量到達允許的最大值時如何拒絕任務)
執行緒池工作過程
通過上面原始碼,我們可以大致看出執行緒池工作大致分為:建立執行緒,新增任務,執行執行緒執行任務。
1.我們可以看出,任務佇列workqueue是作為乙個引數傳進去的,既,執行緒池剛剛建立的時候,是不會馬上執行任務的。
2.執行緒池通過execute()方法來新增乙個任務。通過下面原始碼分析,我們可以知道,新增乙個任務後,執行緒池會進行以下判斷
當當前執行緒數量3.當乙個執行緒執行完乙個任務後,會去workqueue阻塞佇列中獲取下乙個任務執行。
4.當執行緒的空閒時間keepalivetime抵達之後,如果這時執行緒數量》corepoolsize,執行緒池會銷毀這些空閒執行緒。
拒絕策略
當執行緒數量都在執行,且無法建立新執行緒的時候,執行緒池無法為新任務服務,阻塞佇列也放不下了。這時,就要採用合理的拒絕策略來拒絕執行這些新任務。
jdk 內建的拒絕策略如下:
abortpolicy : 直接丟擲異常,阻止系統正常執行。
callerrunspolicy : 只要執行緒池未關閉,該策略直接在呼叫者執行緒中,執行當前被丟棄的任務。顯然這樣做不會真的丟棄任務,但是,任務提交執行緒的效能極有可能會急劇下降。
discardoldestpolicy : 丟棄最老的乙個請求,也就是即將被執行的乙個任務,並嘗試再次提交當前任務。
discardpolicy : 該策略默默地丟棄無法處理的任務,不予任何處理。如果允許任務丟失,這是最好的一種方案。
以上內建拒絕策略均實現了 rejectedexecutionhandler 介面,若以上策略仍無法滿足實際需要,完全可以自己擴充套件 rejectedexecutionhandler 介面。
java執行緒池筆記
那為什麼要用執行緒池 執行緒池作用就是限制系統中執行執行緒的數量。根據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果 少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制線程數量,其他執行緒排隊等候。乙個任務執行完畢,再從佇列的中取最前面的任務開始執行。若佇列中沒有等待程序...
Java併發之執行緒池學習筆記
juc包下有乙個重要的執行緒池的實現,大大優化方便了我們對執行緒的使用,而不再是傳統的new乙個thread。執行緒池相對傳統的直接建立執行緒主要有三個優點 1.統一管理執行緒,可以重用存在的執行緒,避免多次的建立 消亡的開銷,使得效能表現得更好 2.可以有效控制最大併發執行緒數,提高系統資源利用率...
Java多執行緒學習筆記(五)執行緒池
一 執行緒池的基本類 executors 執行緒池工廠,通過 executors 可以取得乙個擁有特定功能的執行緒池。threadpoolexecutor 執行緒池,實現了executor 介面,因此通過這個介面,任何 runnable物件都可以被 threadpoolexecutor執行緒池排程。...