定製併發類(五)在一個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類的執行緒。
執行這個程式,你將看到關於執行緒的開始日期和它的執行時間的資訊。以下截圖顯示了這個例子產生的輸出:
參見
- 在第7章,定製併發類中的實現ThreadFactory介面生成自定義執行緒指南