package com.jackson.deng.concurrent.chapter1.eleven;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
* 用线程工厂创建线程
* function desc : 实现ThreadFactory 接口来创建Thread 对象,当我们储存创建的线程对象时,可以取个性化的名字。
* summary :
* 在面向对象编程的世界中,工厂模式是最有用的设计模式。它是一个创造模式,还有它的目的是创建一个或几个类的对象的对象。
* 然后,当我们想创建这些类的对象时,我们使用工厂来代替new操作。
* 有了这个工厂,我们有这些优势来集中创建对象们:更简单的改变了类的对象创建或者说创建这些对象的方式。
* 更简单的为了限制的资源限制了对象的创建。 例如, 我们只new一个此类型的对象。
* 更简单的生成创建对象的统计数据。
* Java提供一个接口, ThreadFactory 接口实现一个线程对象工厂。 并发 API 使用线程工厂来创建线程的一些基本优势。
*
* @author jackson
*
*/
public class CreateThreadUserThreadFactory {
public class MyThreadFactory implements ThreadFactory {
private String name;
private int counter;
private List<String> status;
public MyThreadFactory(String name) {
this.name = name;
counter = 0;
status = new ArrayList<String>();
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r, name + "-" + counter);
counter++;
status.add("id = " + thread.getId() + ",name = " + thread.getName() + ",date = " + new Date() + "\n");
return thread;
}
public String getStatus() {
StringBuilder buffer = new StringBuilder();
Iterator<String> iterator = status.iterator();
while (iterator.hasNext()) {
buffer.append(iterator.next());
}
return buffer.toString();
}
}
public class Task implements Runnable {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
CreateThreadUserThreadFactory factory = new CreateThreadUserThreadFactory();
MyThreadFactory myFactory = factory.new MyThreadFactory("myFactory");//创建一个线程工厂
Task task = factory.new Task();
Thread thread = null;
System.out.println("Thread starting : ");
for (int i = 0; i < 10; i++) {
thread = myFactory.newThread(task);//通过线程工厂来创建线程
thread.start();
}
System.out.println("Factory status is " + myFactory.getStatus());
}
}
运行结果:
Thread starting :
Factory status is id = 8,name = myFactory-0,date = Tue Nov 04 15:42:44 CST 2014
id = 9,name = myFactory-1,date = Tue Nov 04 15:42:44 CST 2014
id = 10,name = myFactory-2,date = Tue Nov 04 15:42:44 CST 2014
id = 11,name = myFactory-3,date = Tue Nov 04 15:42:44 CST 2014
id = 12,name = myFactory-4,date = Tue Nov 04 15:42:44 CST 2014
id = 13,name = myFactory-5,date = Tue Nov 04 15:42:44 CST 2014
id = 14,name = myFactory-6,date = Tue Nov 04 15:42:44 CST 2014
id = 15,name = myFactory-7,date = Tue Nov 04 15:42:44 CST 2014
id = 16,name = myFactory-8,date = Tue Nov 04 15:42:44 CST 2014
id = 17,name = myFactory-9,date = Tue Nov 04 15:42:44 CST 2014
我们可以看到通过工厂创建了10个线程,其实就是这么简单,extends ThreadFactory,不需要自己写一个工厂,如果那样就复杂化了.