工厂模式是面向对象编程世界中最有用的设计模式。
它是一个创新型的模式,目标是开发一个对象,这个对象的任务是去创建其他类对象。
1.容易改变对象的类或者创建这些对象的方式;
2.容易限制所创建的对象。例如,我们只能创建N个某类型的对象;
3.容易生成对象创建的统计数据;Java并发API提供了ThreadFactory接口以实现一个线程对象工厂。一些并发API高级工具都使用线程工厂去创建线程。
本例中,我们将学习如何去实现ThreadFactory接口去创建线程对象。
MyThreadFactory.java
package com.dylan.thread.ch1.c12.factory; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.concurrent.ThreadFactory; /** * Class that implements the ThreadFactory interface to * create a basic thread factory * */ public class MyThreadFactory implements ThreadFactory { // Attributes to save the necessary data to the factory private int counter; private String name; private List<String> stats; /** * Constructor of the class * @param name Base name of the Thread objects created by this Factory */ public MyThreadFactory(String name){ counter=0; this.name=name; stats=new ArrayList<String>(); } /** * Method that creates a new Thread object using a Runnable object * @param r: Runnable object to create the new Thread */ @Override public Thread newThread(Runnable r) { // Create the new Thread object Thread t=new Thread(r,name+"-Thread_"+counter); counter++; // Actualize the statistics of the factory stats.add(String.format("Created thread %d with name %s on %s\n",t.getId(),t.getName(),new Date())); return t; } /** * Method that returns the statistics of the ThreadFactory * @return The statistics of the ThreadFactory */ public String getStats(){ StringBuffer buffer=new StringBuffer(); Iterator<String> it=stats.iterator(); while (it.hasNext()) { buffer.append(it.next()); } return buffer.toString(); } }
Task.java
package com.dylan.thread.ch1.c12.task; import java.util.concurrent.TimeUnit; public class Task implements Runnable { @Override public void run() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }
Main.java
package com.dylan.thread.ch1.c12.core; import com.dylan.thread.ch1.c12.factory.MyThreadFactory; import com.dylan.thread.ch1.c12.task.Task; /** * Main class of the example. Creates a Thread factory and creates ten * Thread objects using that Factory * */ public class Main { /** * Main method of the example. Creates a Thread factory and creates * ten Thread objects using that Factory * @param args */ public static void main(String[] args) { // Creates the factory MyThreadFactory factory=new MyThreadFactory("MyThreadFactory"); // Creates a task Task task=new Task(); Thread thread; // Creates and starts ten Thread objects System.out.printf("Starting the Threads\n"); for (int i=0; i<10; i++){ thread=factory.newThread(task); thread.start(); } // Prints the statistics of the ThreadFactory to the console System.out.printf("Factory stats:\n"); System.out.printf("%s\n",factory.getStats()); } }
运行结果:
Starting the Threads Factory stats: Created thread 10 with name MyThreadFactory-Thread_0 on Sat May 05 16:34:56 CST 2018 Created thread 11 with name MyThreadFactory-Thread_1 on Sat May 05 16:34:56 CST 2018 Created thread 12 with name MyThreadFactory-Thread_2 on Sat May 05 16:34:56 CST 2018 Created thread 13 with name MyThreadFactory-Thread_3 on Sat May 05 16:34:56 CST 2018 Created thread 14 with name MyThreadFactory-Thread_4 on Sat May 05 16:34:56 CST 2018 Created thread 15 with name MyThreadFactory-Thread_5 on Sat May 05 16:34:56 CST 2018 Created thread 16 with name MyThreadFactory-Thread_6 on Sat May 05 16:34:56 CST 2018 Created thread 17 with name MyThreadFactory-Thread_7 on Sat May 05 16:34:56 CST 2018 Created thread 18 with name MyThreadFactory-Thread_8 on Sat May 05 16:34:56 CST 2018 Created thread 19 with name MyThreadFactory-Thread_9 on Sat May 05 16:34:56 CST 2018