Java併發編程 - Executor框架詳解

Executor框架(接口)負責在用戶級別進行任務的調度和執行, 實現了任務調度和執行的分離.

Executor框架簡介

Executor框架的兩級調度模型

executor-workflow

在上層, Java程序通過將應用分解爲若干個任務(task),
然後使用用戶級的調度器(Executor框架)將task映射爲固定數量的Java線程.

在底層, Java線程與操作系統的線程是一一對應的關係, 由操作系統調度給可用的CPU. 底層的調度不受上層的影響.

Executor框架工作流程

executor-workflow

主要包括3大組件:

  • 異步任務: Runnable或者Callable的實現類;
  • 異步任務的調度和執行(用戶級別): Executor接口的實現類ThreadPoolExecutorScheduledThreadPoolExecutor;
  • 異步計算的結果: 接口Future和接口的實現類FutureTask.

組件間關係如下:

executo-inherent

ThreadPoolExecutor詳解

ThreadPoolExecutor是Executor框架的核心, 是線程池的實現類, 負責異步進行任務的調度和執行, 共有以下重要的配置參數:

  • corePoolSize: 核心線程池大小
  • maximumPoolSize: 最大線程池大小;
  • BlockingQueue: 用於保存任務的工作隊列;

通過工具類Executors, 可以快速創建3種預定義參數的ThreadPoolExecutor, 以下將分別進行分析.

FixedThreadPool詳解

被稱爲可重用固定線程數的線程池, 實際上就是ThreadPoolExecutorcorePoolSizemaximumPoolSize設置爲相同大小,
同時使用了無界隊列的情況.

SingleThreadExecutor詳解

同一時間只有一個線程在執行任務, 爲了確保任務的順序執行.
實際上就是FixedThreadPool, corePoolSizemaximumPoolSize設置爲1的特殊情況.

CachedThreadPool詳解

corePoolSize設置爲0, 在運行過程中會根據需要來創建線程執行任務, 使用沒有容量的SynchronousQueue作爲線程池的工作隊列.
但是maximumPool是無界的, 所以適合於應對大量短任務的情況, 對於運行完任務的線程, 會有一個等待時間,
默認超過60秒沒有新任務到來則自動銷燬, 所以長時間保持空閒的CachedThreadPool不會使用任何資源.

未完待續

發佈了38 篇原創文章 · 獲贊 37 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章