您的位置:首页 > 其它

线程工厂 ThreadFactory源码解读

2014-11-04 12:44 387 查看


线程工厂 ThreadFactory源码解读

分类: 多线程2012-11-21
13: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: