java學習筆記 執行緒池

2021-09-21 02:25:06 字數 2130 閱讀 8977

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執行緒池排程。...