想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

今日分享開始啦,請大家多多指教~

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

一、Executors的理解

Executors類屬於java。util。concurrent包;

執行緒池的建立分為兩種方式:ThreadPoolExecutor 和 Executors;

Executors(靜態Executor工廠)用於建立執行緒池;

工廠和工具方法Executor , ExecutorService , ScheduledExecutorService , ThreadFactory和Callable在此包中定義的類;

jdk1。8API中的解釋如下:

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

二、Executors類圖結構

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

三、Executors常用的方法

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

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方法示例

程式碼

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

輸出結果如下圖

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

結論:示例中建立了數量固定為3的執行緒,由輸出結果截圖可知,遍歷次數為5次,當執行一輪(3次)後,停頓一秒鐘,直到有執行緒空閒出來,才繼續第4次執行。

2、newSingleThreadExecutor方法示例

程式碼

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

輸出結果如下圖

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

結論:示例中建立了建立單個執行緒,每執行一次任務後,睡眠一秒,保證順序地執行各個任務。

3、newCachedThreadPool方法

程式碼

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

輸出結果如下圖

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

結論:示例中根據需要建立帶有快取執行緒的執行緒池,並在可用時將重新使用以前構造的執行緒。

4、newScheduledThreadPool方法示例

程式碼

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

輸出結果如下圖

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

結論:示例中建立執行週期性或定時性任務的執行緒池,由輸出結果可知,設定的1分鐘後執行任務已經生效。

五、Executors建立執行緒池原理

1、無論是建立何種型別執行緒池(newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等等),均會呼叫ThreadPoolExecutor建構函式。

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

2、 ThreadPoolExecutor建構函式中的引數解析

corePoolSize 核心執行緒最大數量,通俗點來講就是,執行緒池中常駐執行緒的最大數量;

maximumPoolSize 執行緒池中執行最大執行緒數(包括核心執行緒和非核心執行緒);

keepAliveTime 執行緒池中空閒執行緒(僅適用於非核心執行緒)所能存活的最長時間;

unit 存活時間單位,與keepAliveTime搭配使用;

workQueue 存放任務的阻塞佇列;

handler 執行緒池飽和策略。

六、Executor介面的理解

Executor屬於java。util。concurrent包下;

Executor是任務執行機制的核心介面;

七、Executor介面的類圖結構

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

由類圖結構可知:

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類建立執行緒池示例

程式碼

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

輸出結果如下圖

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

結論:無論是建立何種型別執行緒池(newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等等),均會呼叫ThreadPoolExecutor建構函式。

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

想要輕鬆入門Java併發程式設計,那你必須吃透多執行緒!看這一篇就夠了

今日份分享已結束,請大家多多包涵和指點!

相關文章