亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Executor 并發框架介紹

1. 前言

從本節開始,我們學習新一章內容 —— 并發框架。

本章總共介紹兩類并發框架,本節帶領大家認識第一個并發框架之 Executor。

本節先介紹 Executor 并發框架的整個體系結構,接著介紹各部分中的核心接口和實現類,下一節中使用 Executor 并發框架實現一個綜合例子,讓大家從整體概念、接口實現、應用有一個較全面的了解。

下面我們正式開始介紹吧。

2. 整體結構介紹

從 JDK 1.5 開始,java 中將工作單元和執行機制做了分離,于是 Executor 并行框架出現。

什么是工作單元(或稱為任務)呢?其實就是我們需要運行的一段邏輯代碼。不管什么邏輯的工作單元,最終都需要通過線程運行。

Executor 并行框架對工作單元、以及工作單元的執行做了高度抽象,形成了一整套完整模型。這個模型包括 3 大部分:

  1. 對工作單元的抽象,即任務。
  2. 任務的執行機制,即如何組織任務的提交、如何管理提交的任務、如何組織多個線程執行。
  3. 對任務執行結果的抽象,即如何跟蹤任務執行狀態,如何獲取任務執行結果。

整體結構已經了解了,接著我們繼續了解各部分的核心接口和實現類。

3. 核心接口和實現類

整個 Executor 框架的核心接口和實現類型如下:

  1. 工作單元:Runnable,Callable
  2. 工作單元執行:Executor,ExecutorService
  3. 工作單元執行結果:Future,FutureTask

Executor 框架核心接口的使用邏輯如下圖:
圖片描述
下面,我們繼續深入了解各接口和實現類的基本知識。

3.1. Runnable & Callable

當不需要關注任務執行結果時,使用 Runnable 很合適,反之使用 Callable。代碼舉例:

Runnable task = new Runnable() {
	public void run() {
		// 任何想要執行的邏輯
	}
}

Callable<String> task = new Callable<String>() {
    public String call() throws Exception {
        // 任何想要執行的邏輯
        return "任務執行后任何想返回的信息";
    }
};

3.2. Executor & ExecutorService

Executor 接口定義了一個用于執行任務的 execute 方法。ExecutorService 是 Executor 的子接口,其職責是對一堆用于執行任務的線程做管理,即定義了線程池的基本操作接口,有很多具體的實現子類,其核心操作有:

  1. execute (Runnable):提交 Runnable 任務。
  2. submit (Callable 或 Runnable):提交 Callable 或 Runnable 任務,并返回代表此任務的 Future 對象。
  3. shutdown ():關閉新的外部任務提交。
  4. shutdownNow ():嘗試中斷正在執行的所有任務,清空并返回待執行的任務列表。
  5. isTerminated ():測試是否所有任務都執行完畢了。
  6. isShutdown ():測試是否該 ExecutorService 已被關閉。

這些核心操作在下一節示例中會有應用。

3.3. Future & FutureTask

Future 接口定義了對任務執行結果的取消、狀態查詢、結果獲取方法。FutureTask 是 Future 的唯一實現類,其職責是提供方便地構建帶有返回結果的任務。Future 接口的核心操作有:

  1. cancel (boolean):嘗試取消已經提交的任務。
  2. isCancelled ():查詢任務是否在完成之前被取消了。
  3. isDone ():查詢任務是否已經完成。
  4. get ():獲取異步任務的執行結果(如果任務沒執行完將等待)。

4. 小結

本節帶領大家對 Executor 框架做整體認識,熟悉其最基本骨架內容,先做到有整體的概念。具體 Executor 框架如何使用呢,我們在下一節講述。希望大家在學習過程中,多思考勤練習,早日掌握之。