天天看點

第四章 線程執行者(一)引言

在這個章節中,我們将覆寫:

<a href="http://ifeve.com/thread-executors-2/" target="_blank">建立一個線程執行者</a>

<a href="http://ifeve.com/thread-executors-3/">建立一個大小固定的線程執行者</a>

<a href="http://ifeve.com/thread-executors-4/">執行者運作帶有傳回結果的任務</a>

<a href="http://ifeve.com/thread-executors-5/">運作多個任務并處理第一個結果</a>

運作多個任務并處理所有結果

執行者延遲運作一個任務

執行者周期性地運作一個任務

執行者取消一個任務

執行者控制一個任務完成

執行者分離任務的啟動和結果的處理

執行者控制被拒絕的任務

引言

通常,當你在java中開發一個簡單的并發程式設計應用程式,你會建立一些runnable對象并建立相應的thread對象來運作它們。如果你開發一個運作多個并發任務的程式,這種途徑的缺點如下:

你必須要實作很多相關代碼來管理thread對象(建立,結束,獲得的結果)。

你必須給每個任務建立一個thread對象。如果你執行一個大資料量的任務,那麼這可能影響應用程式的吞吐量。

你必須有效地控制和管理計算機資源。如果你建立太多線程,會使系統飽和。

為了解決以上問題,從java5開始jdk并發api提供一種機制。這個機制被稱為executor framework,接口核心是executor,executor的子接口是executorservice,而threadpoolexecutor類則實作了這兩個接口。

這個機制将任務的建立與執行分離。使用執行者,你隻要實作runnable對象并将它們送出給執行者。執行者負責執行,執行個體化和運作這些線程。除了這些,它還可以使用線程池提高了性能。當你送出一個任務給這個執行者,它試圖使用線程池中的線程來執行任務,進而避免繼續建立線程。

callable接口是executor framework的另一個重要優點。它跟runnable接口很相似,但它提供了兩種改進,如下:

這個接口中主要的方法叫call(),可以傳回結果。

當你送出callable對象到執行者,你可以擷取一個實作future接口的對象,你可以用這個對象來控制callable對象的狀态和結果。

在這章中提供了11個指南,展示了如何通過使用前面提及的類和java并發api來處理executor framework。