Executor 并發(fā)框架介紹
1. 前言
從本節(jié)開始,我們學習新一章內容 —— 并發(fā)框架。
本章總共介紹兩類并發(fā)框架,本節(jié)帶領大家認識第一個并發(fā)框架之 Executor。
本節(jié)先介紹 Executor 并發(fā)框架的整個體系結構,接著介紹各部分中的核心接口和實現(xiàn)類,下一節(jié)中使用 Executor 并發(fā)框架實現(xiàn)一個綜合例子,讓大家從整體概念、接口實現(xiàn)、應用有一個較全面的了解。
下面我們正式開始介紹吧。
2. 整體結構介紹
從 JDK 1.5 開始,java 中將工作單元和執(zhí)行機制做了分離,于是 Executor 并行框架出現(xiàn)。
什么是工作單元(或稱為任務)呢?其實就是我們需要運行的一段邏輯代碼。不管什么邏輯的工作單元,最終都需要通過線程運行。
Executor 并行框架對工作單元、以及工作單元的執(zhí)行做了高度抽象,形成了一整套完整模型。這個模型包括 3 大部分:
- 對工作單元的抽象,即任務。
- 任務的執(zhí)行機制,即如何組織任務的提交、如何管理提交的任務、如何組織多個線程執(zhí)行。
- 對任務執(zhí)行結果的抽象,即如何跟蹤任務執(zhí)行狀態(tài),如何獲取任務執(zhí)行結果。
整體結構已經(jīng)了解了,接著我們繼續(xù)了解各部分的核心接口和實現(xiàn)類。
3. 核心接口和實現(xiàn)類
整個 Executor 框架的核心接口和實現(xiàn)類型如下:
- 工作單元:Runnable,Callable
- 工作單元執(zhí)行:Executor,ExecutorService
- 工作單元執(zhí)行結果:Future,F(xiàn)utureTask
Executor 框架核心接口的使用邏輯如下圖:
下面,我們繼續(xù)深入了解各接口和實現(xiàn)類的基本知識。
3.1. Runnable & Callable
當不需要關注任務執(zhí)行結果時,使用 Runnable 很合適,反之使用 Callable。代碼舉例:
Runnable task = new Runnable() {
public void run() {
// 任何想要執(zhí)行的邏輯
}
}
Callable<String> task = new Callable<String>() {
public String call() throws Exception {
// 任何想要執(zhí)行的邏輯
return "任務執(zhí)行后任何想返回的信息";
}
};
3.2. Executor & ExecutorService
Executor 接口定義了一個用于執(zhí)行任務的 execute 方法。ExecutorService 是 Executor 的子接口,其職責是對一堆用于執(zhí)行任務的線程做管理,即定義了線程池的基本操作接口,有很多具體的實現(xiàn)子類,其核心操作有:
- execute (Runnable):提交 Runnable 任務。
- submit (Callable 或 Runnable):提交 Callable 或 Runnable 任務,并返回代表此任務的 Future 對象。
- shutdown ():關閉新的外部任務提交。
- shutdownNow ():嘗試中斷正在執(zhí)行的所有任務,清空并返回待執(zhí)行的任務列表。
- isTerminated ():測試是否所有任務都執(zhí)行完畢了。
- isShutdown ():測試是否該 ExecutorService 已被關閉。
這些核心操作在下一節(jié)示例中會有應用。
3.3. Future & FutureTask
Future 接口定義了對任務執(zhí)行結果的取消、狀態(tài)查詢、結果獲取方法。FutureTask 是 Future 的唯一實現(xiàn)類,其職責是提供方便地構建帶有返回結果的任務。Future 接口的核心操作有:
- cancel (boolean):嘗試取消已經(jīng)提交的任務。
- isCancelled ():查詢任務是否在完成之前被取消了。
- isDone ():查詢任務是否已經(jīng)完成。
- get ():獲取異步任務的執(zhí)行結果(如果任務沒執(zhí)行完將等待)。
4. 小結
本節(jié)帶領大家對 Executor 框架做整體認識,熟悉其最基本骨架內容,先做到有整體的概念。具體 Executor 框架如何使用呢,我們在下一節(jié)講述。希望大家在學習過程中,多思考勤練習,早日掌握之。