初讀《Java併發編程的藝術》-第十章:Executor框架 -10.1 Executor框架簡介

在java中,直接使用線程來異步的執行任務,線程的每次建立與銷燬須要必定的計算機資源開銷。每一個任務建立一個線程的話,當任務數量多的時候,則對應的建立銷燬開銷會消耗大量的資源,這種策略最終可能會使處於高負荷狀態的應用崩潰。java

Java中的線程,即便工做單元,也是執行機制。從JDK5開始,把工做單元與執行機制分離開來。編程

  • 工做單元:Runnable 和 Callable
  • 執行機制:Executor 框架

1. Executor 框架簡介

1.1 Executor 框架的兩級調度模型

  • 在HotSpot VM 的線程模型中,Java線程(java.lang.Thread) 被一對一的映射爲本地操做系統的線程。Java線程的啓動與銷燬都與本地線程同步。操做系統會調度全部線程並將它們分配給可用的CPU。
  • 在上層,Java使用多線程的程序,一般會將應用分解爲若干任務,而後使用用戶級別的調度器(Executor框架)將這些任務映射爲對應數量的線程;
  • 底層,操做系統會將這些線程映射到硬件處理器上,切下層硬件的調度並不受應用程序的控制。調度模型以下圖

任務的兩級調度模型

1.2 Executor框架的結構與成員

1. Excutor 框架的結構 -主要由3大部分組成

  • 任務服務器

    • Runnable接口(無返回值)
    • Callable<V>接口(有返回值)
  • 任務的執行
    執行機制的核心接口-Executor,以及實現Executor接口的ExecutorService,
    Executor框架 中有兩個關鍵類實現了ExecutorService:多線程

    • ThreadPoolExecutor併發

      線程池的實現類,執行被提交的線程、任務(Callable/Runnable 接口的實現類中的run()方法)
    • ScheduledThreadPoolExecutor框架

      給定延遲或按期的執行任務(Callable/Runnable 接口的實現類中的run()方法)、命令。比Timer 更加靈活,強大。
  • 異步執行的結果(返回值)異步

    • Future 接口 能夠經過get()方法或者異步執行的結果
    • FutureTask<V>類 (實現了Future接口)

Executor框架的類與結構

Executor框架的使用:

Executor框架使用示意圖

  • 主線程(main線程)建立實現Runnable或者Callable<V> 接口的待執行任務對象。
  • Executors能夠將Runnable封裝爲Callable<V> {Executors.callable(Runnable task)/(Runnable task,result)}。
  • Runnable接口對象能夠交由ExexutorService執行 {ExecutorService.executor(Runnable r) {無返回值};或者把Runnable接口對象或Callable<V>接口對象交由ExecutorService執行 {ExecutorService.submit(Runnable r/Callable<V> t) 有返回值 Futrue接口的對象,現階段JDK返回的是FutureTask};
  • 最後,主線程(main線程)執行 FutrueTask.get()阻塞,等待任務執行完成,同時獲取返回值。也能夠執行FutureTask.cancel(boolean mayInterruptIfRunning)取消執行(參數表示若是正在執行是否取消)。

2. Executor框架的成員

主要成員: ThreadPoolExecutor(線程池)、ScheduldThreadPoolExecutor、Runnable接口、Future<V>接口、Callable<V>接口 以及 Executors工具類。
  1. ThreadPoolExecutor
    一般使用Executors 建立,Executors能夠建立三種類型的ThreadPoolExecutor:SingleThreadExecuto、FixedThreadPool、CachedThreadPool工具

    • FixedThreadPool 建立固定線程數,適用於限制當前線程數量時,適用於負載較重的服務器。
      Executor建立使用的API:spa

      public static ExecutorService newFixedThreadPool(int nThreads);
      public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory);
    • SingleThreadExecutor 建立單個線程,任意時間點不會有多個線程是活動的,適用於須要保證順序執行各任務的時候。
      Executors建立API:操作系統

      public static ExecutorService newSingleThreadPool();
      public static ExecutorService newSingleThreadPool(ThreadFactory threadFactory);
    • CachedThreadPool 根據須要建立新線程,大小無界的線程池,適用於執行大量短時間的異步任務時,或負載較輕的服務器。
      Executors建立API:

      public static ExecutorService newCachedThreadPool();
      public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory);
  2. ScheduledThreadPoolExecutor
    使用Executors工廠類建立,Executors能夠建立兩種類型的ScheduldThreadPoolExecutor

    • ScheduledThreadPoolExecutor 包含若干個線程,適用於多個線程執行週期任務,同時限制執行的線程數量。
      Executors 建立固定個數線程ScheduledThreadPoolExecutor 的API:

      public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize);
      public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory);
    • SingleThreadScheduledExecutor 之包含一個線程,適用於單個後臺線程執行定時任務,同時保證順序執行各個任務。
      Executors 建立單個線程SingleScheduledExecutor 的API:

      public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize);
      public static ScheduledExecutorService newSingleScheduledExecutor(int corePoolSize, ThreadFactory threadFactory);
  3. Future 接口
    與其實現類FutureTask用於表示異步計算的結果。Runnable/Callable接口提交(submit)給ThreadPoolExecutor或者ScheduledThreadPoolExecutor時候,返回值爲FutureTask對象、實現類Future接口的對象。

    <T> Future<T> submit(Callable<T> task);
    <T> Future<T> submit(Runnable task, T result);
    Future<?> submit(Runnable task);
  4. Runnable 和Callable 接口
    均可以被線程池執行,Runnable 無返回值,Callable 有返回值。
    Runnable能夠使用工廠類Executors將其封裝爲Callble
    Executors 對應API以下:

    //將返回的Callable對象提交給線程池返回FutureTask對象,調用FutureTask.get(),返回null
    public static Callable<Object> callable(Runnable task);
    
    //同上提交,FutureTask.get(),返回result對象。
    public static Callable<Object> callable(Runnable task, T result);

參考書籍


《Java併發編程的藝術》 -方騰飛 魏鵬 程曉明 著

相關文章
相關標籤/搜索