Java ThreadFactory接口用法与源码实现

ThreadFactory这个故名思义,就是一个线程工厂。用来创建线程。这里为什么要使用线程工厂呢?其实就是为了统一在创建线程时设置一些参数,如是否守护线程。线程一些特性等,如优先级。通过这个TreadFactory创建出来的线程能保证有相同的特性。下面来看看它的源码吧

它首先是一个接口类,而且方法只有一个。就是创建一个线程。

一、线程工厂 ThreadFactory源码解读

ThreadFactory接口
ThreadFactory接口很简单,源码如下


public interface ThreadFactory {

Thread newThread(Runnable r);

}
我们可以看到ThreadFactory中,只有一个newThread方法,它负责接收一个Runnable对象,并将其封装到Thread对象中,进行执行。
    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;  
       }  

最简单的ThreadFactory实现

我们可以实现上述接口,做一个最简单的线程工厂出来,源码如下:
根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 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:

  1. class SimpleThreadFactory implements ThreadFactory {  
  2.   public Thread newThread(Runnable r) {  
  3.     return new Thread(r);  
  4.   }  
  5. }  
The Executors.defaultThreadFactory method provides a more useful simple implementation, that sets the created thread context to known values before returning it. 

  1. /** 
  2.      * The default thread factory 
  3.      */  
  4.     static class DefaultThreadFactory implements ThreadFactory {  
  5.         static final AtomicInteger poolNumber = new AtomicInteger(1);  
  6.         final ThreadGroup group;  
  7.         final AtomicInteger threadNumber = new AtomicInteger(1);  
  8.         final String namePrefix;  
  9.   
  10.         DefaultThreadFactory() {  
  11.             SecurityManager s = System.getSecurityManager();  
  12.             group = (s != null)? s.getThreadGroup() :  
  13.                                  Thread.currentThread().getThreadGroup();  
  14.             namePrefix = "pool-" +  
  15.                           poolNumber.getAndIncrement() +  
  16.                          "-thread-";  
  17.         }  
  18.   
  19.         public Thread newThread(Runnable r) {  
  20.             Thread t = new Thread(group, r,  
  21.                                   namePrefix + threadNumber.getAndIncrement(),  
  22.                                   0);  
  23.             if (t.isDaemon())  
  24.                 t.setDaemon(false);  
  25.             if (t.getPriority() != Thread.NORM_PRIORITY)  
  26.                 t.setPriority(Thread.NORM_PRIORITY);  
  27.             return t;  
  28.         }  
  29.     }  

下面写一简单示例。
  1. package com.test;  
  2.   
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.ThreadFactory;  
  6.   
  7. class Task implements Runnable{  
  8.     int taskId;  
  9.     public Task(int taskId) {  
  10.         this.taskId=taskId;  
  11.     }  
  12.       
  13.     @Override  
  14.     public void run() {  
  15.         System.out.println(Thread.currentThread().getName()+"--taskId: "+taskId);  
  16.           
  17.     }  
  18. }  
  19.   
  20. class DaemonThreadFactory implements ThreadFactory {  
  21.     @Override  
  22.     public Thread newThread(Runnable r) {  
  23.         Thread t=new Thread(r);  
  24.         t.setDaemon(true);  
  25.         return t;  
  26.     }  
  27.       
  28. }  
  29. public class ThreadFactoryTest {  
  30.     public static void main(String[] args) {  
  31.         ExecutorService exec=Executors.newFixedThreadPool(3,new DaemonThreadFactory());  
  32.         for(int i=0;i<3;i++) {  
  33.             exec.submit(new Task(i));  
  34.         }  
  35.         exec.shutdown();  
  36.     }  
  37. }  

输出如下:

Thread-0--taskId: 0
Thread-1--taskId: 1
Thread-2--taskId: 2

分析:
DaemonThreadFactory中覆写的newThread()方法与submit()方法的调用关系,也就是说 DaemonThreadFactory是如何起作用的。
调试输出其调用关系:


也就是说,submit()时会调用DaemonThreadFactory类的newThread()方法来创建线程。

三、java.util.concurrent 接口 ThreadFactory


public interface ThreadFactory

根据需要创建新线程的对象。使用线程工厂就无需再手工编写对 new Thread 的调用了,从而允许应用程序使用特殊的线程子类、属性等等。

此接口最简单的实现就是:

 class SimpleThreadFactory implements ThreadFactory {
   public Thread newThread(Runnable r) {
     return new Thread(r);
   }
 }
 
Executors.defaultThreadFactory() 方法提供了更有用的简单实现,即在返回线程前将已创建线程的上下文设置为已知的值。

从以下版本开始:
1.5

方法摘要
 ThreadnewThread(Runnable r)
          构造一个新 Thread
 

方法详细信息

newThread

Thread newThread(Runnable r)
构造一个新 Thread。实现也可能初始化属性、名称、守护程序状态、 ThreadGroup 等等。

参数:
r - 由新线程实例所执行的可运行线程
返回:
构造的线程,如果请求创建线程被拒绝,则返回 null

转:http://blog.csdn.net/xin_jmail/article/details/22183175
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值