1. 程式人生 > >【Java併發】Executor框架

【Java併發】Executor框架

Executor框架

Executor框架結構

  1. 任務。包括被執行任務需要實現的介面:Runnable介面或Callable介面。
  2. 任務的執行。任務執行機制的核心介面Executor,以及繼承Executor的ExecutorService介面,以及實現了ExecutorService介面的兩個關鍵類:ThreadPoolExecutor和ScheduledThreadPoolExecutor
  3. 非同步計算的結果。包括介面Future和實現Future介面的FutureTask類。

ThreadPoolExecutor

FixedThreadPool

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

LinkedBlockingQueue是無界佇列,使用無界佇列會帶來如下影響:

  1. 當執行緒池的執行緒數達到corePoolSize後,新任務將在無界佇列中等待,因此執行緒池中的執行緒數不會超過corePoolSize。
  2. 由於1,使用無界佇列時maximumPoolSize將是一個無效引數
  3. 由於1,使用無界佇列時keepAliveTime將是一個無效引數
  4. 由於使用無界佇列,RejectedExecutionHandler將是一個無效引數

SingleThreadExecutor

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

SingleThreadExecutor的corePoolSize和maximumPoolSize都被設定為1。其他引數與FixedThreadPool相同。

newCachedThreadPool

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

corePoolSize為0,maximumPoolSize為無界的,keepAliveTime為60秒,工作佇列為沒有容量的SynchronousQueue。

ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor繼承自ThreadPoolExecutor。它主要用來給定的延遲之後執行任務,或者定期執行任務。

FutureTask

FutureTask除了實現Future介面外,還實現了Runnable介面。

FutureTask有3種狀態:

  1. 未啟動。FutureTask.run()方法還沒被執行之前。
  2. 已啟動。FutureTask.run()方法被執行的過程中。
  3. 已完成。FutureTask.run()方法執行完成後。

FutureTask的get和cancel的執行圖如下:
FutureTask的get和cancel的執行圖

參考

  1. Java併發程式設計的藝術[書籍]