任務執行器(Executor)是一個接口,位於java.util.concurrent包下,它的做用主要是爲咱們提供任務與執行機制(包括線程使用和調度細節)之間的解耦。好比咱們定義了一個任務,咱們是經過線程池來執行該任務,仍是直接創線程來執行該任務呢?經過Executor就能爲任務提供不一樣的執行機制。執行器的實現方式各類各樣,常見的包括同步執行器、一對一執行器、線程池執行器、串行執行器等等。下面咱們將分別介紹這四種執行器,以幫助咱們來理解執行器概念。java
同步執行器是最簡單的執行器,提交給它的任務將由調用線程直接執行,不須要其它線程的幫忙。以下演示代碼中,DirectExecutor繼承了Executor,它的execute方法直接調用了Runnable的run方法。咱們在主線程中建立DirectExecutor對象後執行MyTask任務,實際上該任務將由調用線程(主線程)直接執行,最終輸出executing task…。函數
一對一執行器就是一個任務由一個線程負責,每一個任務提交給執行器時都將建立一個新的線程來執行該任務。以下代碼中,ThreadPerTaskExecutor的execute方法會新建一個線程執行任務。spa
線程池執行器就是擁有線程池功能的執行器,任務提交後將由線程池負責執行。咱們將本身模擬實現一個簡單的線程池,ThreadPoolExecutor類包含了任務隊列taskQueue和十個工做線程workers,構造函數中會建立十個線程並經過while(true)循環不斷從任務隊列中取出任務並執行。而execute方法則是將任務添加到任務隊列中,而後工做線程會執行任務隊列中的任務。線程
串行執行器是一種具備串行功能的執行器,全部任務被加入到一個先進先出隊列中,而後內部的另一個執行器會按照隊列的順序執行任務。前一任務執行完後負責啓動後一任務的執行,這樣就造成了串行。咱們看下簡單的實現,SerialExecutor類中包含了一個任務隊列和執行器,這裏使用ThreadPerTaskExecutor執行器。SerialExecutor的execute方法負責將任務加入到隊列中,並且還負責開啓第一個任務的執行。finally塊主要負責啓動下一個任務,從而造成環環相扣。設計
Executor只是一個接口,它提供了任務和執行的解耦機制。咱們分析了幾種常見執行器的實現,實際工程上能夠根據本身實際狀況來設計實現任務執行器。JDK也爲咱們提供若干有用的執行器,後面有機會咱們將對其進行分析。3d