使用工厂类创建线程
2015-10-24 13:09
218 查看
工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类。
使用工厂类,可以将对象的创建集中化,这样做有以下的好处:
更容易修改类,或者改变创建对象的方式;
更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于n个。
更容易为创建的对象生成统计数据。
Java提供了ThreadFactory接口,这个接口实现了线程对象工厂。Java并发API的高级工具类也使用了线程工厂创建线程。
下面我们学习如何通过实现ThreadFactory接口来创建线程对象,用以生成个性化名称的线程并且保存这些线程对象的统计信息。
1. 创建名称为MyThreadFactory的类,并且实现ThreadFactory接口。
2. 创建名为Task的类并且实现Runnable接口。
3. 创建主类Main
使用工厂类,可以将对象的创建集中化,这样做有以下的好处:
更容易修改类,或者改变创建对象的方式;
更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于n个。
更容易为创建的对象生成统计数据。
Java提供了ThreadFactory接口,这个接口实现了线程对象工厂。Java并发API的高级工具类也使用了线程工厂创建线程。
下面我们学习如何通过实现ThreadFactory接口来创建线程对象,用以生成个性化名称的线程并且保存这些线程对象的统计信息。
1. 创建名称为MyThreadFactory的类,并且实现ThreadFactory接口。
import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.concurrent.ThreadFactory; public class MyThreadFactory implements ThreadFactory { private int counter; //存储线程对象的数量 private String name; //存放工厂的名字 private List<String> stats; //存放线程对象的统计数据 public MyThreadFactory(String name){ counter = 0; this.name = name; stats = new ArrayList<String>(); } @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; } public String getStats(){ StringBuilder sb = new StringBuilder(); Iterator<String> iter = stats.iterator(); while(iter.hasNext()){ sb.append(iter.next()); sb.append("\n"); } return sb.toString(); } }
2. 创建名为Task的类并且实现Runnable接口。
import java.util.concurrent.TimeUnit; public class Task implements Runnable { //仅仅是让线程休眠1秒 @Override public void run() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3. 创建主类Main
public class Main { public static void main(String[] args) { MyThreadFactory factory = new MyThreadFactory("MyThreadFactory"); Task task = new Task(); Thread t; System.out.println("Starting the Threads"); //使用工厂类创建10个线程对象 for(int i=0;i<10;i++){ t = factory.newThread(task); t.start(); } System.out.println("Factory stats:"); System.out.println(factory.getStats()); } }
相关文章推荐
- 动手动脑
- Java学习日记-7 抽象类和接口
- iOS Swift混编详解
- Hibernate-映射关系- 基于外键映射的1<->1映射
- PHP 读取文件的主要方法
- Java学习日记-6 继承
- 解决 RaspberryPi 树莓派 NTP服务异常 无法自动同步时间
- java String StringBuilder StringBuffer 以及各种赋值和注意
- 技术人生“白天求生存,晚上谋发展”
- github、操作系统 资料收集
- 第三次作业
- 深入理解Aho-Corasick自动机算法
- 【C语言】不使用(a+b)/2这种方式,求两个数的平均值。
- 深入理解Aho-Corasick自动机算法
- NOIp 2006 能量项链
- UVA 11235 Frequent values(RMQ)
- Visual Studio 2015 的安装与基本使用方法
- hdu 3944 lucas
- html中input文本框,初始里边有文字提示,当点击时,文字消失
- html中input文本框,初始里边有文字提示,当点击时,文字消失