前面詳細經過源碼解釋了ThreadPoolExecutor類的運行原理,本篇文章來講一下Executor的框架組成。編程
Java的線程既是工做單元也是執行單元,從JDK5開始,把工做單元與執行機制分離開來,工做單元包括Runnable和Callable,而執行機制由Executor框架提供。Executor做爲一個靈活且強大的異步執行框架,其支持多種不一樣類型的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程進行了解耦開發,基於生產者和消費者模型,還提供了對生命週期的支持,以及統計信息收集,應用程序管理機制和性能檢測等機制。小程序
Executor框架的結構
Executor框架主要由3大部分組成以下:服務器
- 任務 :執行任務須要實現的接口:Runnable | Callable 接口
- 任務的執行: 任何執行機制的核心接口是Executor,以及繼承了Executor接口的ExecutorService接口,主要的執行者是實現了Executor接口的兩個實現類 ThreadPoolExecutor和ScheduledThreadPoolExecutor.
- 異步計算的結果: 包括接口Future和實現Future接口的FutureTask類。
Executor框架包含的主要類和接口,以下圖:併發
Executor執行流程以下:
首先主線程建立任務,任務須要實現Runnable或者Callable接口,而後執行execute()方法或者submit方法,提交到線程池中。 若是任務實現的是Runnable接口,線程池運行完任務後就結束了,若是任務實現的Callable接口,則須要將任務執行的接口返回,主線程經過get()或者cancle()方法獲取任務的返回值,或者取消執行任務。框架
上面梳理類Executor框架的主要類和接口,下面對主要的類和接口作一個解釋:異步
- Executor:它是一個接口,也是整個Executor框架的基礎,只定義了一個方法execute() ,接受Runnable類型的參數。 做用是將任務的提交和任務的執行分離了出來。
- ThreadPoolExector :是線程池的核心用來執行提交的任務。
- ScheduledThreadPoolExector:繼承了ThreadPoolExector類,實現了ScheduledExecutorService接口,能夠執行定時任務,在給定的延遲後運行命令,或者週期性運行命令。
- FutureTask:表明異步運算執行的結果
- Runnable和Callable接口的實現類,表明須要執行的任務
Executor框架的主要成員
ThreadPoolExecutor , ScheduledThreadPoolExecutor,Future接口,Runnable接口,Callable接口和Executors是Executor框架的主要成員,下面進行具體的分析:性能
ThreadPoolExector 一般使用工廠類Executors類建立,能夠建立以下3中類型:spa
- SingleThreadPoolExector:建立使用單線程數量的線程池,適用於保證順序地執行各個任務,而且在任意時間點,不會有多個活動的應用場景
- FixedThreadPoolExecutor:建立固定線程數量的線程池,適用於知足資源管理的需求,而須要限制當前線程數量的應用場景,它適用於負載比較重的服務器。
- CachedThreadPoolExecutor:根據須要建立新線程的線程池,大小無界的線程池,適用於執行不少短時間異步任務的小程序,或者負載比較輕的服務器。
ScheduledThreadPoolExecutor.net
- ScheduledThreadPoolExecutor:包含若干個線程。須要多個後臺線程執行週期任務,同時爲了知足資源管理的需求而須要限制後臺線程的數量的應用場景。
- SingleThreadScheduledExecutor:只包含一個線程。須要單個後臺線程週期性的執行任務,同時須要保證順序的執行各我的物的應用場景。
Future接口線程
- 實現Future接口和實現Future接口的FutureTask類用來表示異步計算的結果。
Runnable和Callable接口
- 實現兩個接口的實現類,均可以被線程池執行。Runnable和Callable兩個接口的區別是前者不會返回結果後者會返回結果。
參考: 書籍:《JAVA併發編程藝術》