JAVA線程池ThreadPoolExecutor

java.util.concurrent.ThreadPoolExecutor相關基礎介紹和使用示例。
[ 一 ]、經常使用線程池

最經常使用構造方法爲:html

ThreadPoolExecutor(int corePoolSize,JAVA中IP和整數相互轉化
                   int maximumPoolSize,
                   long keepAliveTime,
                   TimeUnit unit,
                   BlockingQueue<Runnable> workQueue,
java

                   RejectedExecutionHandler handler)緩存


JDK自帶的配置好的線程池: spa

        // 固定工做線程數量的線程池
        ExecutorService executorService1 = Executors.newFixedThreadPool(3);

        // 一個可緩存的線程池
        ExecutorService executorService2 = Executors.newCachedThreadPool();

        // 單線程化的Executor
        ExecutorService executorService3 = Executors.newSingleThreadExecutor();

        // 支持定時的以及週期性的任務執行
        ExecutorService executorService4 = Executors.newScheduledThreadPool(3);
這些預約義好的線程池服務也是基於ThreadPoolExecutor配置的,因此咱們應該從最基本的參數着手瞭解,以下:

參數詳細說明集裝箱運費
[ 1 ]、corePoolSize: 線程池維護線程的最少數量
[ 2 ]、maximumPoolSize:線程池維護線程的最大數量
[ 3 ]、keepAliveTime: 線程池維護線程所容許的空閒時間
[ 4 ]、unit: 線程池維護線程所容許的空閒時間的單位,unit可選的參數爲java.util.concurrent.TimeUnit中的幾個靜態屬性:.net

  • NANOSECONDS
  • MICROSECONDS
  • MILLISECONDS
  • SECONDS
[ 5]、 workQueue: 線程池所使用的緩衝隊列,經常使用的是:java.util.concurrent.ArrayBlockingQueue
[ 6 ]、 handler: 線程池對拒絕任務的處理策略,有四個選擇以下:
  • ThreadPoolExecutor.AbortPolicy():拋出java.util.concurrent.RejectedExecutionException異常
  • ThreadPoolExecutor.CallerRunsPolicy():重試添加當前的任務,他會自動重複調用execute()方法
  • ThreadPoolExecutor.DiscardOldestPolicy():拋棄舊的任務
  • ThreadPoolExecutor.DiscardPolicy():拋棄當前的任務
[ 二 ]、詳細說明
[ 1 ]、當一個任務經過execute(Runnable)方法欲添加到線程池時:
  • 若是此時線程池中的數量小於corePoolSize,即便線程池中的線程都處於空閒狀態,也要建立新的線程來處理被添加的任務。
  • 若是此時線程池中的數量等於 corePoolSize,可是緩衝隊列 workQueue未滿,那麼任務被放入緩衝隊列。
  • 若是此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,而且線程池中的數量小於maximumPoolSize,建新的線程來處理被添加的任務。
  • 若是此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,而且線程池中的數量等於 maximumPoolSize,那麼經過 handler所指定的策略來處理此任務。也就是:處理任務的優先級爲:核心線程corePoolSize、任務隊列workQueue、最大線程 maximumPoolSize,若是三者都滿了,使用handler處理被拒絕的任務。
  • 當線程池中的線程數量大於 corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止。這樣,線程池能夠動態的調整池中的線程數。
相關文章
相關標籤/搜索