Java ThreadFactory接口用法
2024-08-31 06:23:56
根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 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
Thread-1--taskId: 1
Thread-2--taskId: 2
分析:
DaemonThreadFactory中覆写的newThread()方法与submit()方法的调用关系,也就是说DaemonThreadFactory是如何起作用的。
调试输出其调用关系:
也就是说,submit()时会调用DaemonThreadFactory类的newThread()方法来创建线程。
最新文章
- 【Beta】用户问题反馈及处理(一直更新)
- MyBatis源码分析(4)—— Cache构建以及应用
- setTimeout 和 setInterval 的区别
- Java避免创建不必要的对象
- C#委托和事件
- python调用外部子进程,通过管道实现异步标准输入和输出的交互
- 理解CSS中的数学表达式calc()
- JSP + AJAX完整实例及代码
- jquery tree events didn&#39;t work
- mysql 将null转代为0
- Recover deleted pictures in iOS 9
- 暂时解决Sublime Text 2不支持input问题(转)
- HDU 3668 Volume (数学,积分)
- visual studio 生成后事件 Post-Build Event
- Spring mvc 简单异常配置jsp页面
- 【Sort】Merge Sort归并排序
- [Linux] Linux 中的基本命令与目录结构
- 201521123015 《Java程序设计》第2周学习总结
- 基于双向BiLstm神经网络的中文分词详解及源码
- 如何明确区分代码中的1和l
热门文章
- mysql 修改 添加 删除 表字段
- jquery 中 $(&#39;div&#39;,&#39;li&#39;)
- UVALive 2324	Human Gene Functions(动态规划)
- 滑轮关节(b2PulleyJoint)
- 报错:“不是有效的Win32应用程序”的解决办法
- L9,a cold welcome
- Android应用程序基础
- win7 系统保留分区 BCDedit
- zf-关于分页的行数如何配置
- 一个不错的angular 字体库( 引用js文件就行)