1. 程式人生 > >定製併發類(五)在一個Executor物件中使用我們的ThreadFactory

定製併發類(五)在一個Executor物件中使用我們的ThreadFactory

宣告:本文是《 Java 7 Concurrency Cookbook 》的第七章,作者: Javier Fernández González     譯者:許巧輝

在一個Executor物件中使用我們的ThreadFactory

在前面的指南中,實現ThreadFactory介面生成自定義執行緒,我們引進了工廠模式和提供如何實現一個實現ThreadFactory介面的執行緒的工廠例子。

執行者框架(Executor framework)是一種機制,它允許你將執行緒的建立與執行分離。它是基於Executor、ExecutorService介面和實現這兩個介面的ThreadPoolExecutor類。它有一個內部的執行緒池和提供一些方法,這些方法允許你提交兩種任務給執行緒池執行。這兩種任務是:

  • 實現Runnable介面的類,用來實現沒有返回結果的任務
  • 實現Callable介面的類,用來實現有返回結果的任務

在執行者框架(Executor framework)的內部,它提供一個ThreadFactory介面來建立執行緒,這是用來產生新的執行緒。在這個指南中,你將學習如何實現你自己的執行緒類,用一個工廠來建立這個類的執行緒,及如何在執行者中使用這個工廠,所以這個執行者將執行你的執行緒。

準備工作…

閱讀之前的指南,實現ThreadFactory介面生成自定義執行緒,並實現它的例子。

這個指南的例子使用Eclipse IDE實現。如果你使用Eclipse或其他IDE,如NetBeans,開啟它並建立一個新的Java專案。

如何做…

按以下步驟來實現的這個例子:

1.將實現ThreadFactory介面生成自定義執行緒的指南中實現的MyThread、MyThreadFactory和MyTask類複製到這個專案中,所以你將在這個例子中繼續使用它們。

2.實現這個例子的主類,通過建立Main類,並實現mian()方法。

public class Main {
public static void main(String[] args) throws Exception {

3.建立一個新的MyThreadFactory物件,名為threadFactory。

MyThreadFactory threadFactory=new MyThreadFactory("MyThreadFactory");

4.使用Executors類的newCachedThreadPool()方法,建立一個新的Executor物件。傳入前面建立的工廠物件作為引數。這個新的Executor物件將使用這個工廠建立必需的執行緒,所以它將執行MyThread執行緒。

ExecutorService executor=Executors.newCachedThreadPool(threadFactory);

5.建立一個新的Task物件,並使用submit()方法將它提交給執行者。

MyTask task=new MyTask();
executor.submit(task);

6.使用shutdown()方法關閉這個執行者。

executor.shutdown();

7.使用awaitTermination()方法,等待執行者的結束。

executor.awaitTermination(1, TimeUnit.DAYS);

8.寫入一條資訊表明程式的結束。

System.out.printf("Main: End of the program.\n");

它是如何工作的…

在前面指南(實現ThreadFactory介面生成自定義執行緒)中的它是如何工作的部分中,你可以閱讀到關於MyThread、MyThreadFactory和MyTask工作的詳細解釋。

在這個例子的main()方法中,你已使用Executors類的newCachedThreadPool()方法建立一個Executor物件。你已傳入之前建立的工廠物件作為引數,所以已建立的Executor物件將使用這個工廠來建立它所需的執行緒,並且它將執行MyThread類的執行緒。

執行這個程式,你將看到關於執行緒的開始日期和它的執行時間的資訊。以下截圖顯示了這個例子產生的輸出:

3

參見

  • 在第7章,定製併發類中的實現ThreadFactory介面生成自定義執行緒指南