17-Executor框架詳解1

Executors框架介紹

Excecutor框架主要包含3部分的內容:

  • 任務相關的:包含被執行的任務要實現的接口:Runnable接口或Callable接口
  • 任務的執行相關的:包含任務執行機制的核心接口Executor,以及繼承自Executor的ExecutorService接口。Executor框架中有兩個關鍵的類實現了ExecutorService接口(ThreadPoolExecutor和ScheduleThreadPoolExecutor)
  • 異步計算結果相關的:包含接口Future和實現Future接口的FutureTask類

Executor接口

Executor接口中定義了方法execute(Runable able)接口,該方法接受一個Runable實例,他來執行一個任務,任務即實現一個Runable接口的類。

ExecutorService接口

ExecutorService繼承於Executor接口,他提供了更爲豐富的線程實現方法,比如ExecutorService提供關閉自己的方法,以及爲跟蹤一個或多個異步任務執行狀況而生成Future的方法。

ExecutorService有三種狀態:運行、關閉、終止。創建後便進入運行狀態,當調用了shutdown()方法時,便進入了關閉狀態,此時意味着ExecutorService不再接受新的任務,但是他還是會執行已經提交的任務,當所有已經提交了的任務執行完後,便達到終止狀態。如果不調用shutdown方法,ExecutorService方法會一直運行下去,系統一般不會主動關閉

ThreadPoolExecutor類

線程池類,實現了ExecutorService接口中所有方法,該類也是我們經常要用到的

ScheduleThreadPoolExecutor定時器

ScheduleThreadPoolExecutor繼承自ScheduleThreadPoolExecutor,他主要用來延遲執行任務,或者定時執行任務。功能和Timer類似,但是ScheduleThreadPoolExecutor更強大、更靈活一些。Timer後臺是單個線程,而ScheduleThreadPoolExecutor可以在創建的時候指定多個線程。

  • newSingleThreadExecutor
    創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串行執行所有任務。如果這個唯一的線程因爲異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。內部使用了無限容量的LinkedBlockingQueue阻塞隊列來緩存任務,任務如果比較多,單線程如果處理不過來,會導致隊列堆滿,引發OOM。

  • newFixedThreadPool
    創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,在提交新任務,任務將會進入等待隊列中等待。如果某個線程因爲執行異常而結束,那麼線程池會補充一個新線程。內部使用了無限容量的LinkedBlockingQueue阻塞隊列來緩存任務,任務如果比較多,如果處理不過來,會導致隊列堆滿,引發OOM。

  • newCachedThreadPool
    創建一個可緩存的線程池。如果線程池的大小超過了處理任務所需要的線程,
    那麼就會回收部分空閒(60秒處於等待任務到來)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池的最大值是Integer的最大值(2^31-1)。內部使用了SynchronousQueue同步隊列來緩存任務,此隊列的特性是放入任務時必須要有對應的線程獲取任務,任務纔可以放入成功。如果處理的任務比較耗時,任務來的速度也比較快,會創建太多的線程引發OOM。

  • newScheduledThreadPool
    創建一個大小無限的線程池。此線程池支持定時以及週期性執行任務的需求。

Future、Callable接口

Future接口定義了操作異步異步任務執行一些方法,如獲取異步任務的執行結果、取消任務的執行、判斷任務是否被取消、判斷任務執行是否完畢等。

FutureTask類

FutureTask除了實現Future接口,還實現了Runnable接口,因此FutureTask可以交給Executor執行,也可以交給線程執行執行(Thread有個Runnable的構造方法),FutureTask表示帶返回值結果的任務。

第19天:JUC中的Executor框架詳解1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章