概述
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
線程池,使用線程池中的一個線程來執行提交的任務。
線程池解決了兩個問題:
- 減少了per-task的調用的開銷,當執行大量的異步的Task的時候提高了性能。
- 限制和管理資源的功能,包括工作線程以及任務的資源消耗。比如一個數據庫最多支持5個連接,那我們可以使用線程池來限制線程的數量,從而滿足需求。
ScheduledExecutorService
ScheduledExecutorService
僅僅增加了schedule
相關的方法來延遲執行任務。
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor
繼承自ThreadPoolExecutor
,但可以延遲執行任務。當需要多個工作線程時,ScheduledThreadPoolExecutor
比Timer
更適合或者是要求必須繼承ThreadPoolExecutor提供另外的靈活性時才需要。
Future接口
Future
接口表示的是異步的運行結果。
RunnableFuture
接口繼承自Runnable
和Future
接口,這樣RunnableFuture
也是一個Commond,便於使用。
FutureTask
接口實現了RunnableFuture
接口,真正的操作依賴Callable
。
Callable
接口標識帶返回值的任務,與Runnable最大的不同是有返回值。
參考資料
- 《Java併發編程實戰》
- 《Java併發編程-設計原則與模式》