定制並發類(五)在一個Executor對象中使用我們的ThreadFactory

杜老師說 2022-01-07 14:24:20 阅读数:100

定制 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接口生成自定義線程指南

FavoriteLoading添加本文到我的收藏
版权声明:本文为[杜老師說]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071424201828.html