天天看點

線程管理(十二)用線程工廠建立線程

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

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

更簡單的改變了類的對象建立或者說建立這些對象的方式。

更簡單的為了限制的資源限制了對象的建立。 例如, 我們隻new一個此類型的對象。

更簡單的生成建立對象的統計資料。

java提供一個接口, threadfactory 接口實作一個線程對象工廠。 并發 api 使用線程工廠來建立線程的一些基本優勢。

在這個指南中,我們将學習如何實作threadfactory 接口來建立thread 對象,當我們儲存建立的線程對象時,可以取個性化的名字。

<b>準備</b>

指南中的例子是使用eclipse ide 來實作的。如果你使用eclipse 或者其他的ide,例如netbeans, 打開并建立一個新的java項目。

怎麼做呢<b>…</b>

按照這些步驟來實作下面的例子:

1.   建立一個類名為 mythreadfactory 一定實作 threadfactory 接口。

<code>1</code>

<code>public</code> <code>class</code> <code>mythreadfactory</code><code>implements</code> <code>threadfactory {</code>

2.   聲明屬性們:counter,整數,用來儲存線程對象的數量;name,字元串,每個建立線程的名字;stats, 字元串list, 儲存建立的線程對象的統計資料。我們也要實作類的構造函數并初始化。

<code>private</code> <code>int</code> <code>counter;</code>

<code>2</code>

<code>private</code> <code>string name;</code>

<code>3</code>

<code>private</code> <code>list&lt;string&gt; stats;</code>

<code>4</code>

<code>public</code> <code>mythreadfactory(string name){</code>

<code>5</code>

<code>counter=</code><code>0</code><code>;</code>

<code>6</code>

<code>this</code><code>.name=name;</code>

<code>7</code>

<code>stats=</code><code>new</code> <code>arraylist&lt;string&gt;();</code>

<code>8</code>

<code>}</code>

3.   實作 newthread() 方法. 此方法 會接收runnable接口并傳回一個 thread 對象給這個 runnable 接口。 在這裡, 我們生成線程對象的名字,然後建立新的線程對象,最後儲存統計資料。

<code>@override</code>

<code>public</code> <code>thread newthread(runnable r) {</code>

<code>thread t=</code><code>new</code> <code>thread(r,name+</code><code>"-thread_"</code><code>+counter);</code>

<code>counter++;</code>

<code>stats.add(string.format(</code><code>"created thread %d with name %s on %s\n"</code><code>,t.getid(),t.getname(),</code><code>new</code> <code>date()));</code>

<code>return</code> <code>t;</code>

4.   實作 getstatistics()方法 ,傳回 string 對象, 全部的建立的 thread 對象的統計資料。

<code>public</code> <code>string getstats(){</code>

<code>stringbuffer buffer=</code><code>new</code> <code>stringbuffer();</code>

<code>iterator&lt;string&gt; it=stats.iterator();</code>

<code>while</code> <code>(it.hasnext()) {</code>

<code>buffer.append(it.next());</code>

<code>buffer.append(</code><code>"\n"</code><code>);</code>

<code>return</code> <code>buffer.tostring();</code>

<code>9</code>

5.   建立一個類名為 task 一定實作 runnable接口. 對于這個例子,這些任務什麼都不做隻是休眠一秒。

<code>public</code> <code>class</code> <code>task</code><code>implements</code> <code>runnable {</code>

<code>public</code> <code>void</code> <code>run() {</code>

<code>try</code> <code>{ timeunit.seconds.sleep(</code><code>1</code><code>);</code>

<code>}</code><code>catch</code> <code>(interruptedexception e) {</code>

<code>e.printstacktrace();</code>

6.   建立主類. 建立一個類名為 main 并實作main() 方法.

<code>public</code> <code>class</code> <code>main {</code>

<code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>

7.   建立 mythreadfactory 對象和 task 對象。

<code>mythreadfactory factory=</code><code>new</code> <code>mythreadfactory(</code><code>"mythreadfactory"</code><code>);</code>

<code>task task=</code><code>new</code> <code>task();</code>

8.   使用 mythreadfactory 對象建立 10 thread 對象并開始它們.

<code>thread thread;</code>

<code>system.out.printf(</code><code>"starting the threads\n"</code><code>);</code>

<code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i&lt;</code><code>10</code><code>; i++){</code>

<code>thread=factory.newthread(task);</code>

<code>thread.start();</code>

9.   把線程廠的資料寫入控制台。

<code>system.out.printf(</code><code>"factory stats:\n"</code><code>); system.out.printf(</code><code>"%s\n"</code><code>,factory.getstats());</code>

10. 運作例子并檢視結果。

<b>它是怎麼工作的</b><b>…</b>

threadfactory 接口隻有一個方法是 newthread。它接收 runnable 對象作為參數并傳回一個 thread 對象。當你實作一個 threadfactory 接口,你必須實作此接口并覆寫這個方法。最基本的 threadfactory隻有一行。

<code>return</code> <code>new</code> <code>thread(r);</code>

你可以加一些變量來提升這個實作:

在這個例子中建立自定義線程,名字使用特别形式或者繼承java thread類來建立自己的thread類。

儲存線程建立資料,如之前的例子。

限制線程建立個數。

驗證線程的建立。

和你能想到的任何東西。

使用工廠設計模式是很好的練習,但是,如果你實作一個 threadfactory 接口來集中建立線程,那麼你必須再檢查代碼確定使用的線程都是用這個工廠建立的。

<b>參見</b>

第七章: 并發類的定制:實作threadfactory接口來生成自定義線程

第七章: 并發類的定制:在執行者對象中使用我們的 threadfactory

繼續閱讀