古詩詞大全網 - 成語故事 - 線程池的四種創建方式及區別

線程池的四種創建方式及區別

核心線程數為0,非核心線程數為MAX_VALUE,

隊列不存儲值,總認為隊列是滿的,所以每次執行任務時都會創建非核心線程,非核心線程空閑了超過60秒(默認),就會自動回收。

2.newfixedThreadPool 創建定長的線程池

在達到長度之前,每提交壹個任務都會創建壹個線程,如果達到線程池最大數量,則提交到隊列中,在空閑的時候也不會自動回收線程

核心線程數為參數傳入,非核心線程數和核心線程數壹樣,

隊列為無界隊列,資源有限的時候容易引起OOM.

與newSingledThreadPool 不同的是核心線程數不為1.

3.newSingledThreadPool 創建單壹線程執行。

只有壹個線程按順序執行任務,如果這個線程出現異常結束,會有另壹個線程取代並按順序執行。

corepoolsize 核心線程數為1 ,非核心線程數為1 ,

隊列為無界隊列,

單工作線程最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。

4.newScheduedThreadPool 創建壹個定長的線程池,而且支持定時的以及周期性的任務執行,支持定時及周期性任務執行。如果延遲3秒執行或每隔3秒執行壹次

核心線程數為 參數設定,非核心線程數為MAX_VALUE

定義了壹個DelayedWorkQueue,它是壹個有序隊列,會通過每個任務按照距離下次執行時間間隔的大小來排序;

線程池執行邏輯說明:

判斷核心線程數是否已滿,核心線程數大小和corePoolSize參數有關,未滿則創建線程執行任務

若核心線程池已滿,判斷隊列是否滿,隊列是否滿和workQueue參數有關,若未滿則加入隊列中

若隊列已滿,判斷線程池是否已滿,線程池是否已滿和maximumPoolSize參數有關,若未滿創建線程執行任務

若線程池已滿,則采用拒絕策略處理無法執執行的任務,拒絕策略和handler參數有關

拒絕策略

拒絕策略 => 默認采用的是AbortPolicy拒絕策略,直接在程序中拋出RejectedExecutionException異常因為是運行時異常,不強制catch,這種處理方式不夠優雅。處理拒絕策略有以下幾種比較推薦:

在程序中捕獲RejectedExecutionException異常,在捕獲異常中對任務進行處理。針對默認拒絕策略

使用CallerRunsPolicy拒絕策略,該策略會將任務交給調用execute的線程執行壹般為主線程,此時主線程將在壹段時間內不能提交任何任務,從而使工作線程處理正在執行的任務。此時提交的線程將被保存在TCP隊列中,TCP隊列滿將會影響客戶端,這是壹種平緩的性能降低

自定義拒絕策略,只需要實現RejectedExecutionHandler接口即可

如果任務不是特別重要,使用DiscardPolicy和DiscardOldestPolicy拒絕策略將任務丟棄也是可以

public class ThreadTest {

// ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

//

// scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

// public void run() {

// System.out.println("delay 1 seconds, and excute every 3 seconds");

//

// }

//

// }, 1, 3, TimeUnit.SECONDS);

}