java線程池ThreadPoolExecutor理解,深入理解java之線程池

來源:互聯網
上載者:User

java線程池ThreadPoolExecutor理解,深入理解java之線程池

Java通過Executors提供四種線程池,分別為:
newCachedThreadPool建立一個可緩衝線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則建立線程。
newFixedThreadPool 建立一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。
newScheduledThreadPool 建立一個定長線程池,支援定時及週期性任務執行。
newSingleThreadExecutor 建立一個單線程化的線程池,它只會用唯一的背景工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

熟悉這四種線程池,首先 先瞭解ThreadPoolExecutor

ThreadPoolExecutor中定義了以下幾個屬性比較重要

corePoolSize:線程池中的線程數量,線程池中預設開啟幾個線程處理 任務隊列中的任務

  (註:這個並不是固定的,根據隊列(workQueue)的不同實作類別型而改變)

maximumPoolSize:線程池中的最大線程數量,這個屬性感覺和上面的corePoolSize衝突,明明上面定義了線程資料了,怎麼這裡又控制了

最大線程數量,其實 一樣和 上面提到的一樣(根據隊列(workQueue)的不同實作類別型 ,需要用到該屬性進行相應的 任務拒絕策略)

keepAliveTime;//超過corePoolSize的空閑線程,在多長時間內會被銷毀
TimeUnit unit;//keepAliveTime的單位
BlockingQueue<Runnable> workQueue:任務隊列,被提交的但尚未被執行的任務

主要有以下幾種實作類別型

SynchronousQueue:直接提交的隊列,該隊列沒有容量,每一個擦入操作都要對應一個相應的刪除操作,反之每個刪除操作對應相應的插入操作。

           SynchronousQueue不儲存任務,它總是將任務提交給線程執行,如果沒有閒置進程,則嘗試建立新的進程,如果進程

          已達到maximumPoolSize設定的最大線程數,則執行拒絕策略

ArrayBlockingQueue:有界任務隊列,ArrayBlockingQueue的建構函式必須帶一個容量參數(例如n),表示該隊列的最大容量。

             當有新任務執行時,這個定義當前線程數為t,建構函式的容量參數為n,當前隊列長度為l

           1.t<corePoolSize時,建立新的線程之心

                               2.t>corePoolSize且l<n時,插入到任務隊列,等待空閑線程執行

                               3.t>corePoolSize且l>=n時,建立新的線程執行新任務

                               4.t>maximumPoolSize時,執行拒絕策略。

LinkedBlockingQueue:無界任務隊列,當有新任務執行時,如果線程池中線程數小於corePoolSize則建立新的線程,否則進入隊列等待。

           如果沒有任務建立速度和處理速度差異很大,無界隊列會保持快速增長,直到耗盡系統記憶體

 

  PriorityBlockingQueue:優先順序隊列,可以控制任務的執行先後順序,是一個特殊的無界隊列。無論有界的隊列無界的隊列,都是按照先進先出演算法

             處理任務(絮叨),而該隊列破例可以根據任務自身的優先順序順序先後執行。

ThreadFactory threadFactory//線程工廠,用於建立線程,一般預設
RejectedExecutionHandler handler;//拒絕策略,當任務太多來不及處理,如何拒絕任務

  JDK內建的拒絕策略如下:

  AbortPolity策略:該策略會直接拋出異常,阻止系統正常工作

  CallerRunsPolity策略:只要線程為關閉,該策略直接在調用者線程中,運行當前被丟棄的任務

      DiscardOledstPolicy策略:該策略將丟棄最老的一個請求,也就是即將被執行的一個任務,並嘗試再次提交當前任務。

  DiscardPlicy 策略:該策略默默的丟棄無法處理的任務,不予任務處理。

如果以上策略不能滿足實際應用需求,可以擴充RejectedExecutionHandler 介面

public interface RejectedExecutionHandler {    void rejectedExecution(Runnable r, ThreadPoolExecutor executor);}

其中,r為請求執行的任務,executor為當前線程池。

瞭解了ThreadPoolExecutor的上述屬性,然後分析Executors提供四種線程池就很簡單了

Executors.newFixedThreadPool(nThreads) 

    public static ExecutorService newFixedThreadPool(int nThreads) {        return new ThreadPoolExecutor(nThreads, nThreads,                                      0L, TimeUnit.MILLISECONDS,                                      new LinkedBlockingQueue<Runnable>());    }

返回了一個corePoolSize, maximumPoolSize大小相等並且使用了LinkedBlockingQueue任務隊列的線程池,因為對於固定大小的線程池而言,不存線上程數量的動態

變化,因此corePoolSize,和maximumPoolSize可以相等,同時它使用無界隊列存放無法立即執行的任務,當任務提交非常頻繁的時候,該隊列可能迅速膨脹,從而耗盡

系統資源。

Executors.newSingleThreadExecutor()

    public static ExecutorService newSingleThreadExecutor() {        return new FinalizableDelegatedExecutorService            (new ThreadPoolExecutor(1, 1,                                    0L, TimeUnit.MILLISECONDS,                                    new LinkedBlockingQueue<Runnable>()));    }

返回單線程的線程池,是newFixedThreadPool()方法的一種退化,只是簡單的將線程池的線程數量設定為1

Executors.newCachedThreadPool()

 public static ExecutorService newCachedThreadPool() {        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                      60L, TimeUnit.SECONDS,                                      new SynchronousQueue<Runnable>());    }

返回corePoolSize為0 maximumPoolSize無窮大的線程池,這意味著在沒有任務時,該線程內無線程,而當任務被提交時,該線程池會使用閒置線程執行任務,若無空閑

線程,則將任務加入SynchronousQueue隊列,而SynchronousQueue隊列是一種直接提交的隊列,它總會迫使線程池增加新的線程執行任務,當任務執行完畢後,

由於corePoolSize為0,因此空線程又會在指定時間內(60s)被回收。

對於newCachedThreadPool(),如果同時又大量任務被提交,而任務的執行又不那麼快時,那麼系統便會開啟等量的線程處理,這樣的做法可能會很快耗盡系統的資源。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.