天天看点

线程管理(十二)用线程工厂创建线程

在面向对象编程的世界中,工厂模式是最有用的设计模式。它是一个创造模式,还有它的目的是创建一个或几个类的对象的对象。然后,当我们想创建这些类的对象时,我们使用工厂来代替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

继续阅读