您的位置:首页 > 其它

使用工厂类创建线程

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

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

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

更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: