想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了
今日分享開始啦,請大家多多指教~
一、Executors的理解
Executors類屬於java。util。concurrent包;
執行緒池的建立分為兩種方式:ThreadPoolExecutor 和 Executors;
Executors(靜態Executor工廠)用於建立執行緒池;
工廠和工具方法Executor , ExecutorService , ScheduledExecutorService , ThreadFactory和Callable在此包中定義的類;
jdk1。8API中的解釋如下:
二、Executors類圖結構
三、Executors常用的方法
public static ExecutorService newFixedThreadPool(int nThreads) 一種執行緒數量固定的執行緒池,當執行緒處於空閒狀態時,他們並不會被回收,除非執行緒池被關閉。當所有的執行緒都處於活動狀態時,新的任務都會處於等待狀態,直到有執行緒空閒出來。
public static ExecutorService newSingleThreadExecutor() 建立單個執行緒。它適用於需要保證順序地執行各個任務;並且在任意時間點,不會有多個執行緒是活動的應用場景;如果單個執行緒掛掉後,會重啟一個執行緒繼續執行任務。
public static ExecutorService newCachedThreadPool() 建立一個根據需要建立新執行緒的執行緒池,但在可用時將重新使用以前構造的執行緒, 如果沒有可用的執行緒,將建立一個新的執行緒並將其新增到該池中。 未使用六十秒的執行緒將被終止並從快取中刪除;即用的時候建立執行緒,不用的時候銷燬執行緒。
- public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 建立一個執行緒池,可以排程命令在給定的延遲之後執行,或定期執行;支援執行定時性或週期性任務。
public static ExecutorService newWorkStealingPool(int parallelism) jdk1。8才出現的,建立一個維護足夠的執行緒以支援給定的並行級別的執行緒池,並且可以使用多個佇列來減少爭用。 ( jdk1。8版本新增的方法 )
四、執行緒池的建立分為兩種方式(主要介紹透過Executors類建立的方式)
1、newFixedThreadPool方法示例
程式碼
輸出結果如下圖
結論:示例中建立了數量固定為3的執行緒,由輸出結果截圖可知,遍歷次數為5次,當執行一輪(3次)後,停頓一秒鐘,直到有執行緒空閒出來,才繼續第4次執行。
2、newSingleThreadExecutor方法示例
程式碼
輸出結果如下圖
結論:示例中建立了建立單個執行緒,每執行一次任務後,睡眠一秒,保證順序地執行各個任務。
3、newCachedThreadPool方法
程式碼
輸出結果如下圖
結論:示例中根據需要建立帶有快取執行緒的執行緒池,並在可用時將重新使用以前構造的執行緒。
4、newScheduledThreadPool方法示例
程式碼
輸出結果如下圖
結論:示例中建立執行週期性或定時性任務的執行緒池,由輸出結果可知,設定的1分鐘後執行任務已經生效。
五、Executors建立執行緒池原理
1、無論是建立何種型別執行緒池(newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等等),均會呼叫ThreadPoolExecutor建構函式。
2、 ThreadPoolExecutor建構函式中的引數解析
corePoolSize 核心執行緒最大數量,通俗點來講就是,執行緒池中常駐執行緒的最大數量;
maximumPoolSize 執行緒池中執行最大執行緒數(包括核心執行緒和非核心執行緒);
keepAliveTime 執行緒池中空閒執行緒(僅適用於非核心執行緒)所能存活的最長時間;
unit 存活時間單位,與keepAliveTime搭配使用;
workQueue 存放任務的阻塞佇列;
handler 執行緒池飽和策略。
六、Executor介面的理解
Executor屬於java。util。concurrent包下;
Executor是任務執行機制的核心介面;
七、Executor介面的類圖結構
由類圖結構可知:
ThreadPoolExecutor 繼承了AbstractExecutorService介面;
AbstractExecutorService介面實現了ExecutorService介面;
ExecutorService繼承了Executor介面;
因此以下部分主要講解ThreadPoolExecutor類。
八、Executor介面中常用的方法
void execute(Runnable command) 在將來的某個時間執行給定的命令。 該命令可以在一個新執行緒,一個合併的執行緒中或在呼叫執行緒中執行,由Executor實現。
九、執行緒池的建立分為兩種方式(主要介紹透過ThreadPoolExecutor方式)
1、ThreadPoolExecutor類中的構造方法
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,defaultHandler)
2、 ThreadPoolExecutor類中建構函式的引數解析
corePoolSize 核心執行緒最大數量,通俗點來講就是,執行緒池中常駐執行緒的最大數量;
maximumPoolSize 執行緒池中執行最大執行緒數(包括核心執行緒和非核心執行緒);
keepAliveTime執行緒池中空閒執行緒(僅適用於非核心執行緒)所能存活的最長時間;
unit 存活時間單位,與keepAliveTime搭配使用;
workQueue 存放任務的阻塞佇列;
handler 執行緒池飽和策略。
3、ThreadPoolExecutor類建立執行緒池示例
程式碼
輸出結果如下圖
結論:無論是建立何種型別執行緒池(newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等等),均會呼叫ThreadPoolExecutor建構函式。
今日份分享已結束,請大家多多包涵和指點!
相關文章
- 2021-09-21i97980ex處理器加海盜船128g記憶體怎麼樣
- 2021-06-18虐哭了!22道Java高頻面試題,你能抗得住面試官的幾個靈魂拷問?
- 2021-06-05開發人員只要會編碼就完事了嗎?不,他們往往忽略了這些...
- 2021-05-23嬌小妹子竟變魁梧大漢?低劣畫師的成品圖:像極了古代幹農活的婦女
- 2021-04-01Excel技巧|單元格自定義還能當作IF函式用? 五種方法帶你瞭解自定義用法