[java多線程]-Executor框架簡述

概述

Java1.5後引入的Executor框架。雖然Executor是一個簡單的接口,確爲靈活而且強大的異步任務執行框架提供了基礎。Executor的優點:

  • 任務的提交和執行解耦,並用Runnable表示任務。
  • Executor的實現提供了對線程生命週期的支持。
  • Executor的實現能支持不同類型的任務的提交和不同的執行策略。

通過將任務的提交和執行解耦,很容易就可以指定任務和修改執行策略。而在執行策略中定義了指定了任務的“what,where,when,how”等。

  • 在什麼(what)線程中執行?
  • 任務按照什麼(what)順序執行(FIFO,LIFO,優先級)?
  • 有多少個(How many) 任務能併發執行?
  • 在隊列中又多少個(How many)任務在等待任務?
  • 如果系統由於過載而需要拒絕一個任務,那麼應該選擇哪一個(which)任務執行?另外,如何(How)通知應用程序有任務被拒絕了?
  • 在執行一個任務之前或者之後,應該進行哪些(what)動作?

Executor框架

public interface Executor {
    void execute(Runnable command);
}

Executor僅僅提供標準的接口。

常見子類

ExecutorService

ExecutorService接口在原有的Executor的基礎上,添加了生命週期的管理和submit方法返回Future對象。

AbstractExecutorService

AbstractExecutorService提供了ExecutorService接口方法的一些默認實現。此類實現了submit, invokeAny and invokeAll方法,submit方法內部實現中使用RunnableFuture作爲返回值,而默認的實現是 FutureTask 類。

ThreadPoolExecutor

ThreadPoolExecutor線程池,使用線程池中的一個線程來執行提交的任務。

線程池解決了兩個問題:

  1. 減少了per-task的調用的開銷,當執行大量的異步的Task的時候提高了性能。
  2. 限制和管理資源的功能,包括工作線程以及任務的資源消耗。比如一個數據庫最多支持5個連接,那我們可以使用線程池來限制線程的數量,從而滿足需求。

ScheduledExecutorService

ScheduledExecutorService僅僅增加了schedule相關的方法來延遲執行任務。

ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor繼承自ThreadPoolExecutor,但可以延遲執行任務。當需要多個工作線程時,ScheduledThreadPoolExecutorTimer更適合或者是要求必須繼承ThreadPoolExecutor提供另外的靈活性時才需要。

Future接口

Future接口表示的是異步的運行結果。

RunnableFuture接口繼承自RunnableFuture接口,這樣RunnableFuture也是一個Commond,便於使用。

FutureTask接口實現了RunnableFuture接口,真正的操作依賴Callable

Callable接口標識帶返回值的任務,與Runnable最大的不同是有返回值。

參考資料

  • 《Java併發編程實戰》
  • 《Java併發編程-設計原則與模式》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章