[Java并发包学习三]ThreadFactory介绍
2016-05-24 14:50
615 查看
概述
ThreadFactory翻译过来是线程工厂,顾名思义,就是用来创建线程的,它用到了工厂模式的思想。它通常和线程池一起使用,主要用来控制创建新线程时的一些行为,比如设置线程的优先级,名字等等。它是一个接口,接口中只有一个方法:1 2 3 4 5 6 7 8 9 | /** * Constructs a new {@code Thread}. Implementations may also initialize * priority, name, daemon status, {@code ThreadGroup}, etc. * * @param r a runnable to be executed by new thread instance * @return constructed thread, or {@code null} if the request to * create a thread is rejected */ Thread newThread(Runnable r); |
实验
下面我们通过一个简单的实验来解释ThreadFactory的作用,下面的代码首先创建一个类MyThreadFactoryTest,实现了ThreadFactory,newThread()方法中做了一些简单的行为:创建新线程时,为线程设置一个名字;
创建新线程时,在控制台打印一条提示信息,并附上新线程的名字
1 2 3 4 5 6 7 8 910 | package com.winwill.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; /** * @author qifuguang * @date 15/8/11 20:28 */ public class MyThreadFactoryTest implements ThreadFactory { private final AtomicInteger count = new AtomicInteger(0); public Thread newThread(Runnable r) { int c = count.incrementAndGet(); Thread t = new Thread(r); t.setName("test_thread_no." + c); System.out.println("Create new thread, thread name: " + t.getName()); return t; } public static void main(String[] args) throws Exception { ExecutorService service = Executors.newFixedThreadPool(5, new MyThreadFactoryTest()); for (int i = 0; i < 5; i++) { service.submit(new Runnable() { public void run() { System.out.println("Start execute..."); } }); } } } |
Create new thread, thread name: test_thread_no.1
Create new thread, thread name: test_thread_no.2
Start execute…
Start execute…
Create new thread, thread name: test_thread_no.3
Start execute…
Create new thread, thread name: test_thread_no.4
Start execute…
Create new thread, thread name: test_thread_no.5
Start execute…
可以看到,运行结果符合我们的预期。
JDK中默认的ThreadFactory
在JDK的Executors类中有一个DefaultThreadFactory类,它实现了ThreadFactory,它是JDK中默认的线程工厂类,从源码可以看到这个线程工厂类为线程池中新创建的线程设置的名字为:pool-[线程池编号]-thread-[该线程池的线程编号]
1 2 3 4 5 6 7 8 910 | /** * The default thread factory */ static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private 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; } } |
相关文章推荐
- java后面接的参数
- [Java并发包学习二]Executors介绍
- 学习练习 java 不重复的三位偶数
- [Java并发包学习一]Executor和ExecutorService
- 【转】Eclipse提示No java virtual machine(转载)
- [Java并发包学习七]解密ThreadLocal
- java回调函数的作用以及运用
- javap 可以打印出用于jni调用的java函数的签名信息
- JDK各个版本的新特性jdk1.5-jdk8
- 如何学习struts框架?
- JDK各个版本的新特性jdk1.5-jdk8
- jdk7和8的一些新特性介绍
- Java1.8源码集合类学习UML图——Collection接口&AbstractCollection抽象类
- jdk7和8的一些新特性介绍
- 运行java时出现 “could not open jvm.cfg ”的解决办法之一
- jdk1.6,jdk1.7共存
- jdk1.6,jdk1.7共存
- meidaPlayer java.io.IOException: setDataSource failed.: status=0x800000
- 学习练习 java 程序设计园的周长面积
- 【Android】Eclipse上string.xml发生Found text“ ” where item tag is expected错误,如何解决