线程工厂 ThreadFactory源码解读
2014-11-04 12:44
387 查看
线程工厂 ThreadFactory源码解读
分类: 多线程2012-11-2113:16 1232人阅读 评论(0) 收藏 举报
工厂模式是我们学习编程时,接触到的第一个设计模式,也是最简单、最常用的一个设计模式。在JDK的源码中,大量使用工厂模式,ThreadFactory就是其中一种。
在我们一般的使用中,创建一个线程,通常有两种方式:
继承Thread类,覆盖run方法,实现我们需要的业务
继承Runnable接口,实现run方法,实现我们需要的业务,并且调用new Thread(Runnable)方法,将其包装为一个线程执行
设想这样一种场景,我们需要一个线程池,并且对于线程池中的线程对象,赋予统一的线程优先级、统一的名称、甚至进行统一的业务处理或和业务方面的初始化工作,这时工厂方法就是最好用的方法了
ThreadFactory接口
ThreadFactory接口很简单,源码如下:
[java] view
plaincopy
public interface ThreadFactory {
Thread newThread(Runnable r);
}
我们可以看到ThreadFactory中,只有一个newThread方法,它负责接收一个Runnable对象,并将其封装到Thread对象中,进行执行。
最简单的ThreadFactory实现
我们可以实现上述接口,做一个最简单的线程工厂出来,源码如下:
[java] view
plaincopy
public class SimpleThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
}
上述线程工厂,只是创建了一个新线程,其他什么都没干。实际使用时,一般不会创建这么简单的线程工厂。
[java] view
plaincopy
public class FixCountThreadFactory implements ThreadFactory{
private final int MAX_THREAD;
private final AtomicInteger count = new AtomicInteger(0);
public FixCountThreadFactory(int maxThread) {
MAX_THREAD = maxThread;
}
@Override
public Thread newThread(Runnable r) {
int incrementAndGet = count.incrementAndGet();
if(incrementAndGet > MAX_THREAD)
{
count.decrementAndGet();
return null;
}
return new Thread(r);
}
}
上述线程工厂,可以控制创建线程的总数。
JDK中默认的线程工厂
在Executors工具类中,JDK提供了一个非常简单的线程工程,源码如下:
[java] view
plaincopy
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;
}
相关文章推荐
- 线程工厂 ThreadFactory源码解读
- EventBus源码解读详细注释(3)PostThread、MainThread、BackgroundThread、Async四种线程模式的区别
- EventBus源码解读详细注释(2)MainThread线程模型分析
- 【Thread】线程工厂-ThreadFactory
- Java Concurrency - ThreadFactory, 使用工厂方法创建线程
- Netty源码解读之线程
- 线程本地变量ThreadLocal源码解读
- Java 工具(jmap,jstack)在linux上的源码分析(三)执行的线程vm thread
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:基于工厂方法的迷宫
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:延迟初始化对象
- spring 源码解读与设计详解:3 FactoryBean
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:基于工厂方法的迷宫
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:参数化工厂方法
- 线程工程ThreadFactory
- spring beans源码解读之--XmlBeanFactory
- spring beans源码解读之--XmlBeanFactory
- Nutch1.7源码再研究之---12 Fetch中的FetcherThread线程源码分析
- 解读工厂模式Factory Pattern
- 《GOF设计模式》—工厂方法(Factory Method)—Delphi源码示例:平行的类层级架构
- java.util.concurrent解读,自定义线程工厂,线程池