執行緒管理(十二)用執行緒工廠建立執行緒
宣告:本文是《 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