1、ThreadFactory
根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
2、代码实例
package com.xxx.util;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ThreadFactory;
/**
* Created with IntelliJ IDEA.
* Date: 15-4-17
* Time: 上午10:50
* To change this template use File | Settings | File Templates.
*/
public class MyThreadFactory implements ThreadFactory {
private int counter;
private String name;
private List<String> states;
public MyThreadFactory(String name){
counter = 0;
this.name = name;
states = new ArrayList<String>();
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r,name+"-Thread_"+counter);
counter++;
states.add(String.format("Created thread %d with name %s on %s\n", thread.getId(),thread.getName(),new Date()));
return thread;
}
public String getStates(){
StringBuffer stringBuffer = new StringBuffer();
Iterator<String> iterator = states.iterator();
while (iterator.hasNext()){
stringBuffer.append(iterator.next());
stringBuffer.append("\n");
}
return stringBuffer.toString();
}
}
package com.xxx.util;
import java.util.concurrent.TimeUnit;
/**
* Created with IntelliJ IDEA.
* Date: 15-4-17
* Time: 上午10:58
* To change this template use File | Settings | File Templates.
*/
public class MyThreadFactoryTask implements Runnable {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.xxx.util;
/**
* Created with IntelliJ IDEA.
* Date: 15-4-17
* Time: 上午10:59
* To change this template use File | Settings | File Templates.
*/
public class MyThreadFactoryMain {
public static void main(String[] args){
MyThreadFactory myThreadFactory = new MyThreadFactory("myThreadFactory");
MyThreadFactoryTask task = new MyThreadFactoryTask();
Thread thread;
System.out.printf("Starting the Threads\n");
for(int i=0;i<10;i++){
thread = myThreadFactory.newThread(task);
thread.start();
}
System.out.printf("Factory stats:\n");
System.out.printf("%s\n",myThreadFactory.getStates());
}
}
3、运行结果
4、结论
ThreadFactory接口只有一个方法,即newThread,它以Runnable接口对象作为传入参数并且返回一个线程对象,当实现ThreadFactory接口时,必须实现覆盖这个方法,大多数基本的线程工厂类只有一个,即return new Thread(r);。