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