1. 程式人生 > >執行緒管理(十二)用執行緒工廠建立執行緒

執行緒管理(十二)用執行緒工廠建立執行緒

宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷

用執行緒工廠建立執行緒

在面向物件程式設計的世界中,工廠模式是最有用的設計模式。它是一個創造模式,還有它的目的是建立一個或幾個類的物件的物件。然後,當我們想建立這些類的物件時,我們使用工廠來代替new操作。

有了這個工廠,我們有這些優勢來集中建立物件們:

  • 更簡單的改變了類的物件建立或者說建立這些物件的方式。
  • 更簡單的為了限制的資源限制了物件的建立。 例如, 我們只new一個此型別的物件。
  • 更簡單的生成建立物件的統計資料。

Java提供一個介面, ThreadFactory 介面實現一個執行緒物件工廠。 併發 API 使用執行緒工廠來建立執行緒的一些基本優勢。

在這個指南中,我們將學習如何實現ThreadFactory 介面來建立Thread 物件,當我們儲存建立的執行緒物件時,可以取個性化的名字。

準備
指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 開啟並建立一個新的java專案。

怎麼做呢
按照這些步驟來實現下面的例子:

1.   建立一個類名為 MyThreadFactory 一定實現 ThreadFactory 介面。

public class MyThreadFactory implements ThreadFactory {

2.   宣告屬性們:counter,整數,用來儲存執行緒物件的數量;name,字串,每個建立執行緒的名字;stats, 字串list, 儲存建立的執行緒物件的統計資料。我們也要實現類的建構函式並初始化。

private int counter;
private String name;
private List<String> stats;
public MyThreadFactory(String name){
counter=0;
this.name=name;
stats=new ArrayList<String>();
}

3.   實現 newThread() 方法. 此方法 會接收Runnable介面並返回一個 Thread 物件給這個 Runnable 介面。 在這裡, 我們生成執行緒物件的名字,然後建立新的執行緒物件,最後儲存統計資料。

@Override
public Thread newThread(Runnable r) {
Thread t=new Thread(r,name+"-Thread_"+counter);
counter++;
stats.add(String.format("created thread %d with name %s on %s\n",t.getId(),t.getName(),new Date()));

return t;
}

4.   實現 getStatistics()方法 ,返回 String 物件, 全部的建立的 Thread 物件的統計資料。

public String getStats(){
StringBuffer buffer=new StringBuffer();
Iterator<String> it=stats.iterator();
while (it.hasNext()) {
buffer.append(it.next());
buffer.append("\n");
}
return buffer.toString();
}

5.   建立一個類名為 Task 一定實現 Runnable介面. 對於這個例子,這些任務什麼都不做只是休眠一秒。

public class Task implements Runnable {
@Override
public void run() {
try { TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

6.   建立主類. 建立一個類名為 Main 並實現main() 方法.

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

7.   建立 MyThreadFactory 物件和 Task 物件。

MyThreadFactory factory=new MyThreadFactory("MyThreadFactory");
Task task=new Task();

8.   使用 MyThreadFactory 物件建立 10 Thread 物件並開始它們.

Thread thread;
System.out.printf("Starting the Threads\n");
for (int i=0; i<10; i++){
thread=factory.newThread(task);
thread.start();
}

9.   把執行緒廠的資料寫入控制檯。

System.out.printf("Factory stats:\n"); System.out.printf("%s\n",factory.getStats());

10. 執行例子並檢視結果。

它是怎麼工作的

ThreadFactory 介面只有一個方法是 newThread。它接收 Runnable 物件作為引數並返回一個 Thread 物件。當你實現一個 ThreadFactory 介面,你必須實現此介面並覆蓋這個方法。最基本的 ThreadFactory只有一行。

return new Thread(r);

你可以加一些變數來提升這個實現:

  • 在這個例子中建立自定義執行緒,名字使用特別形式或者繼承Java Thread類來建立自己的Thread類。
  • 儲存執行緒建立資料,如之前的例子。
  • 限制執行緒建立個數。
  • 驗證執行緒的建立。
  • 和你能想到的任何東西。

使用工廠設計模式是很好的練習,但是,如果你實現一個 ThreadFactory 介面來集中建立執行緒,那麼你必須再檢查程式碼確保使用的執行緒都是用這個工廠建立的。

參見

  • 第七章: 發類的定製實現ThreadFactory介面來生成自定義執行緒
  • 第七章: 併發類的定製在執行者物件中使用我們的 ThreadFactory