線程池介紹

創建線程池的方法

1、使用JDK1.5自帶的Executors框架創建線程池。
Executors框架提供了4種線程池的創建方法

  • 創建一個固定數量的線程池
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
            0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
    }

特點:
1、線程池的核心線程數和最大線程數都是初始創建時傳入的線程數,
2、空閒線程結束的超時時間爲0
3、使用的LinkedBlockingQueue阻塞隊列,該阻塞隊列是鏈
表結構的無解隊列

  • 創建單個線程的線程池
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

特點:
1、核心線程和最大線程都是1,
2、空閒線程結束的超時時間爲0
3、使用的也是LinkedBlockingQueue阻塞隊列

  • 創建緩存線程池
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
    }

特點:
1、核心線程數爲0
2、線程池最大線程爲Integer.MAX_VALUE
3、空閒線程結束超時時間爲60s
4、使用的是SynchronousQueue阻塞隊列,該阻塞隊列不會存儲元素

  • 創建定時線程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
public ScheduledThreadPoolExecutor(int corePoolSize) {
     super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
           new DelayedWorkQueue());
 } 

該線程池的特點創建一個可定時執行任務的線程池

Executors框架分析

1、Executors框架提供的集中創建線程池的方法,底層實際上都是使用瞭如下構造方法

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

參數介紹:
corePoolSize:核心線程的數量,線程池在創建之後會一直存在的線程數量
maximimPoolSize:線程池的最大線程數
keepAliveTime:空閒線程的超時時間(當一個線程處於空閒狀態時,空閒多久會被停止)
unit:空閒時間的時間單位
workQueue:阻塞隊列
handler:決絕策略(如果線程已經達到最大且阻塞隊列也已經滿了,線程池要執行的處理策略)

2、運行分析

  • 如果當前線程池中的線程數量沒有達到corePoolSize,則有新的任務直接創建新的線程執行
  • 如果當前線程數量超過了corePoolSize,但是隊列沒有滿,則直接將任務放入阻塞隊列
  • 如果當前線程數量達到了核心線程數且阻塞隊列也滿了,但是沒有達到最大線程數量,則繼續創建新的線程執行任務
  • 如果當前線程已經達到線程池最大線程數量,則執行拒絕策略

3、常用的阻塞隊列的介紹

  • LinkedBlockingQueue:是一個基於鏈表的無界阻塞隊列,隊列大小爲Integer.MAX_VALUE
  • ArrayBlockingQueue:數組結構的有界隊列
  • PriorityBlockingQueue:有優先級的阻塞隊列
  • SynchronousQueue:不會存儲元素的阻塞隊列
  • DelayedWorkQueue:一個無界隊列,能按照一定的順序對隊列中的元素進行排序

4、拒絕策略

  • Executors框架提供的創建線程池的方法,使用的默認的拒絕策略
 private static final RejectedExecutionHandler defaultHandler =
        new AbortPolicy();

AbortPolicy:如果創建線程池不傳拒絕策略,則默認使用該策略。
該策略表示當線程池隊列滿了且達到最大線程時,直接拒絕處理,拋出異常,讓調用者自行處理
DiscardPolicy:丟棄策略,線程池不做任何處理
DiscardOldestPolicy:丟棄舊的任務來執行新的任務
CallerRunsPolicy:既不拋棄新任務,也不拋棄舊任務,直接在當前的線程運行新的任務。當前線程一般都是主線程
如果需要自定義拒絕策略,可以實現RejectedExecutionHandler接口

5、創建線程的工廠
每當線程池需要創建一個線程時,都是通過線程工廠來創建的,如果沒有指定線程工廠,就回使用默認的defaultThreadFactor
通過看DefaultThreadFactory()類源碼,該類實現了ThreadFactory接口,所以,如果有需要定製線程工廠,實現ThreadFactory接口即可

6、阻塞隊列的方法
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章