本节书摘来异步社区《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接口来创建线程,你必须检查代码,以保证所有的线程都是使用这个工厂创建的。