工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用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 ", 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(" "); } 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()); } }