【併發編程】- ThreadPoolExecutor篇

  • Executor框架

  • Executor框架的兩級調度模型(基於HotSpot)

    • 在上層,Java多線程程序一般把應用分解爲若干個任務,而後使用用戶級的調度器(Executor框架)將這些任務映射爲固定數量的線程;
    • 在底層,操做系統內核將這些線程映射到硬件處理器上。

    任務的兩級調度模型小程序

  • 結構
    • 3大部分
      • 任務。包括被執行任務須要實現的接口:Runnable接口或Callable接口。
      • 任務的執行。包括任務執行機制的核心接口Executor,以及繼承自ExecutorExecutorService接口。Executor框架有兩個關鍵類實現了ExecutorService接口(ThreadPoolExecutorScheduledThreadPoolExecutor)。
      • 異步計算的結果。包括接口Future和實現Future接口的FutureTask類。

    類與接口數組

  • 成員
    • ThreadPoolExecutor:一般使用工廠類Executors來建立。
      • SingleThreadExecutor
        • 使用單個線程,適用於須要保證順序地執行各個任務;而且在任意時間點,不會有多個線程是活動的應用場景。
      • FixedThreadPool
        • 使用固定線程數,適用於負載比較重的服務器。
      • CachedThreadPool
        • 會根據須要建立新線程,大小無界,適用於執行不少的短時間異步任務的小程序,或者是負載較輕的服務器。
    • ScheduledThreadPoolExecutor:一般使用工廠類Executors來建立.
      • 包含若干個線程的ScheduledThreadPoolExecutor。
        • 建立固定個數線程,適用於須要多個後臺線程執行週期任務,同時爲了知足資源管理的需求而須要限制後臺線程的數量的應用場景。
      • 只包含一個線程的ScheduledThreadPoolExecutor。
        • 建立單個線程,適用於須要單個後臺線程執行週期任務,同時須要保證順序地執行各個任務的應用場景。
    • Future接口
      • FutureTask實現類,表示異步計算的結果。
    • Runnable接口和Callable接口
      • Runnable不會返回結果。
      • Callable能夠返回結果。
  • ThreadPoolExecutor詳解
  • 4個組件
    • corePool:核心線程池的大小。
    • maximumPool:最大線程池的大小。
    • BlockingQueue:用來暫時保存任務的工做隊列。
    • RejectedExecutionHandler:當ThreadPoolExecutor已經關閉或ThreadPoolExecutor已經飽和時(達到了最大線程池大小且工做隊列已滿),execute()方法將要調用的Handler
  • 3種ThreadPoolExecutor
    • FixedThreadPool
      • 可重用固定線程數的線程池。
      • 使用無界隊列LinkedBlockingQueue做爲線程池的工做隊列(隊列的容量爲Integer.MAX_VALUE。
    • SingleThreadExecutor
      • 使用單個worker線程的Executor
      • 使用無界隊列LinkedBlockingQueue做爲線程池的工做隊列(隊列的容量爲Integer.MAX_VALUE。
    • CachedThreadPool
      • 會根據須要建立新線程的線程池。
      • 使用無容量的SynchronousQueue做爲線程池的工做隊列。
  • ScheduledThreadPoolExecutor詳解
    • ScheduledThreadPoolExecutor繼承自ThreadPoolExecutor。它主要用來在給定的延遲以後運行任務,或者按期執行任務
    • ScheduledThreadPoolExecutor的執⾏主要分爲兩⼤部分
      • 當調⽤ScheduledThreadPoolExecutor的scheduleAtFixedRate()fang法或者scheduleWith-FixedDelay()方法時,會向ScheduledThreadPoolExecutor的DelayQueue添加一個實現了RunnableScheduledFutur接⼝的ScheduledFutureTask
      • 線程池中的線程從DelayQueue中獲取ScheduledFutureTask,而後執行任務

ScheduledThreadPoolExecutor 運行機制圖緩存


  • Java裏的阻塞隊列服務器

    • JDK 7提供了7個阻塞隊列
      • ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列。
      • LinkedBlockingQueue:一個由鏈表結構組成的有界阻塞隊列。
      • PriorityBlockingQueue:一個支持優先級排序的無界阻塞隊列。
      • DelayQueue:一個使用優先級隊列實現的無界阻塞隊列。
      • SynchronousQueue:一個不存儲元素的阻塞隊列。
      • LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
      • LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。
  • ArrayBlockingQueue:數組有界阻塞隊列,默認線程非公平的訪問隊列,公平性是使用可重入鎖實現多線程

public ArrayBlockingQueue(int capacity, boolean fair) {
    if (capacity <= 0)
    throw new IllegalArgumentException();
    this.items = new Object[capacity];
    lock = new ReentrantLock(fair);
    notEmpty = lock.newCondition();
    notFull = lock.newCondition();
}
  • LinkedBlockingQueue:鏈表有界阻塞隊列,默認長度Integer.Max_VALUE
  • PriorityBlockingQueue:是一個支持優先級的無界阻塞隊列。默認狀況下元素採起用然順序升序排列
  • DelayQueue是一個支持延時獲取元素的無界阻塞隊列,使用PriorityQueue來實現
    • 應用場景:
      • 緩存系統的設計:能夠用DelayQueue保存緩存元素的有效期,使用一個線程循環查詢DelayQueue,一旦能從DelayQueue中獲取元素時,表示緩存有效期到了
      • 定時任務調度:使用DelayQueue保存當天將會執行的任務和執行時間,一旦從DelayQueue中獲取到任務就開始執行,好比TimerQueue就是使用DelayQueue實現的
  • SynchronousQueue:是一個不存儲元素的阻塞隊列。它支持公平訪問隊列,默認狀況下線程採用非公平性策略訪問隊列。
  • LinkedTransferQueue:是一個由鏈表結構組成的無界阻塞TransferQueue隊列。
    • 比其餘阻塞隊列多了tryTransfer和transfer方法
      • 當前有消費者正在等待接收元素,transfer方法能夠把生產者傳入的元素馬上transfer(傳輸)給消費者,沒有消費者在等待接收元素時,將元素存放在隊列的tail節點,並等到該元素被消費者消費了才返回
      • 同上,試探性是否能直接傳給消費者,若無消費者,返回false。
  • LinkedBlockingDeque:是一個由鏈表結構組成的雙向阻塞隊列
相關文章
相關標籤/搜索