天天看点

《Java程序员面试秘笈》—— 1.13 使用工厂类创建线程

本节书摘来异步社区《java 7并发编程实战手册》一书中的第1章,第1.13节,作者:【西】javier fernández gonzález,更多章节内容可以访问云栖社区“异步社区”公众号查看。

工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类。

使用工厂类,可以将对象的创建集中化,这样做有以下的好处:

◆ 更容易修改类,或者改变创建对象的方式;

◆ 更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于n个。

◆ 更容易为创建的对象生成统计数据。

java提供了threadfactory接口,这个接口实现了线程对象工厂。java并发api的高级工具类也使用了线程工厂创建线程。

在本节中,我们将学习如何通过实现threadfactory接口来创建线程对象,用以生成个性化名称的线程并且保存这些线程对象的统计信息。

准备工作

本节的范例是在eclipse ide里完成的。无论你使用eclipse还是其他的ide(比如netbeans),都可以打开这个ide并且创建一个新的java工程。

范例实现

按照接下来的步骤实现本节的范例。

1.创建名为mythreadfactory的类,并且实现threadfactory接口。

``

public class mythreadfactory implements threadfactory {``

2.声明3个属性:整型数字counter,用来存储线程对象的数量;字符串name,用来存放每个线程的名称;字符串列表stats,用来存放线程对象的统计数据。同时实现带参数的构造器来初始化这3个属性。

@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 %sn",t.getid(),t.getname(),new date()));

return t;

}<code>`</code>

4.实现getstatistics()方法,返回一个字符串对象,用来表示所有线程对象的统计数据。

public class task implements runnable {

}

6.创建范例的主程序。创建一个包含main()方法的主类main。

mythreadfactory factory=new mythreadfactory("mythreadfactory");

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

8.使用工厂类mythreadfactory创建10个线程对象,并且启动它们。

system.out.printf("factory stats:n");

system.out.printf("%sn",factory.getstats());<code>`</code>

10.运行范例并且查看运行结果。

工作原理

threadfactory接口只有一个方法,即newthread,它以runnable接口对象作为传入

参数并且返回一个线程对象。当实现threadfactory接口时,必须实现覆盖这个方法。大多数基本的线程工厂类只有一行,即:

return new thread(r);``

可以通过增加一些变化来强化实现方法覆盖。

◆ 创建一个个性化线程,如本范例使用一个特殊的格式作为线程名,或者通过继承thread类来创建自己的线程类;

◆ 保存新创建的线程的统计数据,如本节的范例那样;

◆ 限制创建的线程的数量;

◆ 对生成的线程进行验证;

◆ 更多你可以想到的。

使用工厂设计模式是一个很好的编程实践,但是,如果是通过实现threadfactory接口来创建线程,你必须检查代码,以保证所有的线程都是使用这个工厂创建的。

继续阅读