工厂模式是一个创造模式,它的目标是开发一个类,此类的任务是创建一个或多个类的对象。 然后,当要创建这些类其中一个类的对象时,使用工厂代替使用 new 操作符。
Java 提供了 ThreadFactory 接口来实现一个 Thread 对象工厂。 Java Concurrency API 的某些高级工具,如 Executor 框架或 Fork/Join 框架,使用线程工厂来创建线程。
Java Concurrency API 中工厂模式的另一个例子是 Executor 类。它提供了很多方法来创建不同种类的 Executor 对象。
本节的示例代码在 com.elanzone.books.noteeg.chpt7.sect04 package中
线程扩展类 : MyThread : extends Thread
private Date creationDate; private Date startDate; private Date finishDate; public MyThread(Runnable target, String name) { super(target, name); setCreationDate(); } private void setCreationDate() { creationDate = new Date(); } private void setStartDate() { startDate = new Date(); } private void setFinishDate() { finishDate = new Date(); }
@Override public void run() { setStartDate(); super.run(); setFinishDate(); }
public long getExecutionTime() { return finishDate.getTime() - startDate.getTime(); }
@Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append(getName()); buffer.append(": "); buffer.append(" Creation Date: "); buffer.append(creationDate); buffer.append(" : Running time: "); buffer.append(getExecutionTime()); buffer.append(" Milliseconds."); return buffer.toString(); }
线程工厂实现类 :MyThreadFactory : implements ThreadFactory
private int counter; private String prefix; public MyThreadFactory(String prefix) { this.prefix = prefix; counter = 1; }
@Override public Thread newThread(Runnable r) { MyThread myThread = new MyThread(r, prefix + "-" + counter); counter++; return myThread; }
Runnable 实现类 : MyTask
@Override public void run() { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } }
控制类 :Main
MyThreadFactory factory=new MyThreadFactory("MyThreadFactory"); MyTask task = new MyTask(); Thread thread = factory.newThread(task); thread.start(); try { thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("Main: Thread information.\n"); System.out.printf("%s\n",thread); System.out.printf("Main: End of the example.\n");
在本节中实现了一个扩展 Thread 类的定制的 MyThread 类。此类有3个属性保存创建时间、开始运行的时间和结束运行的时间。 使用开始时间和结束时间属性,实现了 getExecutionTime() 方法返回线程执行任务的时间。 最后覆盖了 toString() 方法来生成关于线程的信息。
有了自己的线程类后,实现 ThreadFactory 接口实现了一个工厂来创建该线程类的对象。 如果您作为一个独立的对象来使用此工厂,则不一定要实现 ThreadFactory 接口。 但是如果您要和 Java Concurrency API 的其他类一起所使用此工厂,您必须实现 ThreadFactory 接口。 ThreadFactory 接口只有一个方法 newThread(),其参数是一个 Runnable 对象,返回一个 Thread 对象来执行该 Runnable 对象。 本例中,返回一个 MyThread 对象。
为了检查这2个类,实现了 MyTask 类(此类实现 Runnable 接口)。此任务将在 MyThread 对象管理的线程中执行。 一个 MyTask 实例让运行它的线程睡上2秒钟。
在本例的 main 方法中,用一个 MyThreadFactory 对象创建了一个 MyThread 对象来运行一个 MyTask 对象。 运行此程序,您将看到执行的线程的开始时间和运行时间的信息。