根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。
 
JDK中的介绍:

An object that creates new threads on demand. Using thread factories removes hardwiring of calls tonew Thread, enabling applications to use special thread subclasses, priorities, etc.

The simplest implementation of this interface is just:

class SimpleThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
return new Thread(r);
}
}

The Executors.defaultThreadFactory method provides a more useful simple implementation, that sets the created thread context to known values before returning it. 

  /**
* The default thread factory
*/
static class DefaultThreadFactory implements ThreadFactory {
static final AtomicInteger poolNumber = new AtomicInteger(1);
final ThreadGroup group;
final AtomicInteger threadNumber = new AtomicInteger(1);
final String namePrefix; DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null)? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
} public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}

下面写一简单示例。

package com.test;  

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; class Task implements Runnable{
int taskId;
public Task(int taskId) {
this.taskId=taskId;
} @Override
public void run() {
System.out.println(Thread.currentThread().getName()+"--taskId: "+taskId); }
} class DaemonThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread t=new Thread(r);
t.setDaemon(true);
return t;
} }
public class ThreadFactoryTest {
public static void main(String[] args) {
ExecutorService exec=Executors.newFixedThreadPool(3,new DaemonThreadFactory());
for(int i=0;i<3;i++) {
exec.submit(new Task(i));
}
exec.shutdown();
}
}

输出如下:

 
Thread-0--taskId: 0
Thread-1--taskId: 1
Thread-2--taskId: 2
 
分析:
DaemonThreadFactory中覆写的newThread()方法与submit()方法的调用关系,也就是说DaemonThreadFactory是如何起作用的。
调试输出其调用关系:
 
也就是说,submit()时会调用DaemonThreadFactory类的newThread()方法来创建线程。

最新文章

  1. 【Beta】用户问题反馈及处理(一直更新)
  2. MyBatis源码分析(4)—— Cache构建以及应用
  3. setTimeout 和 setInterval 的区别
  4. Java避免创建不必要的对象
  5. C#委托和事件
  6. python调用外部子进程,通过管道实现异步标准输入和输出的交互
  7. 理解CSS中的数学表达式calc()
  8. JSP + AJAX完整实例及代码
  9. jquery tree events didn&#39;t work
  10. mysql 将null转代为0
  11. Recover deleted pictures in iOS 9
  12. 暂时解决Sublime Text 2不支持input问题(转)
  13. HDU 3668 Volume (数学,积分)
  14. visual studio 生成后事件 Post-Build Event
  15. Spring mvc 简单异常配置jsp页面
  16. 【Sort】Merge Sort归并排序
  17. [Linux] Linux 中的基本命令与目录结构
  18. 201521123015 《Java程序设计》第2周学习总结
  19. 基于双向BiLstm神经网络的中文分词详解及源码
  20. 如何明确区分代码中的1和l

热门文章

  1. mysql 修改 添加 删除 表字段
  2. jquery 中 $(&#39;div&#39;,&#39;li&#39;)
  3. UVALive 2324 Human Gene Functions(动态规划)
  4. 滑轮关节(b2PulleyJoint)
  5. 报错:“不是有效的Win32应用程序”的解决办法
  6. L9,a cold welcome
  7. Android应用程序基础
  8. win7 系统保留分区 BCDedit
  9. zf-关于分页的行数如何配置
  10. 一个不错的angular 字体库( 引用js文件就行)