工厂模式是我们学习编程时,接触到的第一个设计模式,也是最简单、最常用的一个设计模式。在JDK的源码中,大量使用工厂模式,ThreadFactory就是其中一种。
上述线程工厂,只是创建了一个新线程,其他什么都没干。实际使用时,一般不会创建这么简单的线程工厂。
在我们一般的使用中,创建一个线程,通常有两种方式:
- 继承Thread类,覆盖run方法,实现我们需要的业务
- 继承Runnable接口,实现run方法,实现我们需要的业务,并且调用new Thread(Runnable)方法,将其包装为一个线程执行
ThreadFactory接口
ThreadFactory接口很简单,源码如下:
- public interface ThreadFactory {
- Thread newThread(Runnable r);
- }
我们可以看到ThreadFactory中,只有一个newThread方法,它负责接收一个Runnable对象,并将其封装到Thread对象中,进行执行。
最简单的ThreadFactory实现
我们可以实现上述接口,做一个最简单的线程工厂出来,源码如下:
- public class SimpleThreadFactory implements ThreadFactory{
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r);
- }
- }
上述线程工厂,只是创建了一个新线程,其他什么都没干。实际使用时,一般不会创建这么简单的线程工厂。
- 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提供了一个非常简单的线程工程,源码如下:
- 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;
- }