Executor框架(接口)負責在用戶級別進行任務的調度和執行, 實現了任務調度和執行的分離.
Executor框架簡介
Executor框架的兩級調度模型
在上層, Java程序通過將應用分解爲若干個任務(task),
然後使用用戶級的調度器(Executor
框架)將task映射爲固定數量的Java線程.
在底層, Java線程與操作系統的線程是一一對應的關係, 由操作系統調度給可用的CPU. 底層的調度不受上層的影響.
Executor框架工作流程
主要包括3大組件:
- 異步任務:
Runnable
或者Callable
的實現類; - 異步任務的調度和執行(用戶級別):
Executor
接口的實現類ThreadPoolExecutor
和ScheduledThreadPoolExecutor
; - 異步計算的結果: 接口
Future
和接口的實現類FutureTask
.
組件間關係如下:
ThreadPoolExecutor詳解
ThreadPoolExecutor
是Executor框架的核心, 是線程池的實現類, 負責異步進行任務的調度和執行, 共有以下重要的配置參數:
corePoolSize
: 核心線程池大小maximumPoolSize
: 最大線程池大小;BlockingQueue
: 用於保存任務的工作隊列;
通過工具類Executors
, 可以快速創建3種預定義參數的ThreadPoolExecutor
, 以下將分別進行分析.
FixedThreadPool詳解
被稱爲可重用固定線程數的線程池, 實際上就是ThreadPoolExecutor
將corePoolSize
和maximumPoolSize
設置爲相同大小,
同時使用了無界隊列的情況.
SingleThreadExecutor詳解
同一時間只有一個線程在執行任務, 爲了確保任務的順序執行.
實際上就是FixedThreadPool
, corePoolSize
和maximumPoolSize
設置爲1的特殊情況.
CachedThreadPool詳解
corePoolSize
設置爲0, 在運行過程中會根據需要來創建線程執行任務, 使用沒有容量的SynchronousQueue
作爲線程池的工作隊列.
但是maximumPool
是無界的, 所以適合於應對大量短任務的情況, 對於運行完任務的線程, 會有一個等待時間,
默認超過60秒沒有新任務到來則自動銷燬, 所以長時間保持空閒的CachedThreadPool
不會使用任何資源.
未完待續