隊列不存儲值,總認為隊列是滿的,所以每次執行任務時都會創建非核心線程,非核心線程空閑了超過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);
}