執行器物件中使用自定義ThreadFactory
執行器物件中使用自定義ThreadFactory
在上一節中,我們介紹了工廠模式,並通過ThreadFactory介面,提供瞭如何實現執行緒工廠的範例。
Executor框架是一種將執行緒建立和執行分開的機制。它基於Executor和ExecutorService介面,以及實現這兩個介面的ThreadPoolExecutor類。此框架包含一個內部執行緒池,並提供方法傳送兩種任務到池執行緒中執行它們,這兩種任務如下所示:
- 實現Runnable介面的類,實現不返回值的任務
- 實現Callable介面的類,實現返回值的任務
Executor框架在內部使用ThreadFactory介面建立執行緒,用於生成新執行緒。本節將學習如何實現自定義執行緒類和執行緒工廠來建立此類的執行緒,以及如何在執行器中使用這個工廠來執行這些執行緒。
準備工作
本範例通過Eclipse開發工具實現。如果使用諸如NetBeans的開發工具,開啟並建立一個新的Java專案。
實現過程
通過如下步驟實現範例:
-
複製MyThread、MyThreadFactory和MyTask類到工程中,它們在“”小節中實現,本範例中將使用到這些類。
-
通過建立名為Main的類,新增main()方法,實現本範例主類:
public class Main { public static void main(String[] args) throws Exception{
-
建立名為threadFactory的新的MyThreadFactory物件:
MyThreadFactory threadFactory=new MyThreadFactory("MyThreadFactory");
-
使用Executors類的newCachedThreadPool()方法建立新的Executor物件,將之前建立的工廠物件作為引數傳遞。新的Executor物件將使用這個工廠建立必要的執行緒,所以它將執行MyThread執行緒:
ExecutorService executor=Executors.newCachedThreadPool(threadFactory);
-
建立新的Task物件,使用submit()方法將此物件傳送到執行器:
MyTask task=new MyTask(); executor.submit(task);
-
使用shutdown()方法關閉執行器:
executor.shutdown();
-
使用awaitTermination()方法等待執行器結束:
executor.awaitTermination(1, TimeUnit.DAYS);
-
輸出指明程式終止的資訊到控制檯:
System.out.printf("Main: End of the program.\n"); } }
工作原理
在上節“工作原理”中,詳細解釋了MyThread、MyThreadFactory和MyTask類的工作原理。
本範例的main()方法中,使用Executors類的newCachedThreadPool()方法建立Executor物件,將之前建立的工廠物件作為引數傳遞,所以建立的Executor物件將使用此工廠建立它所需要的執行緒,並且還執行MyThread類的執行緒。
執行程式將看到關於執行緒啟動時間和執行時間的資訊,下圖顯示本範例在控制檯輸出的執行資訊:
更多關注
本章“實現為fork/join框架生成自定義執行緒的ThreadFactory介面”小節