线程池---友好的线程池命名

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/85048563

大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵https://img-blog.csdnimg.cn/20181129224604602.png ​   

之前介绍过java 推荐的线程池和如何自定义线程池

https://mp.csdn.net/postedit/81783309

今天在使用线程池的时候发现线程池名字实在是太丑了

是这样的

pool-1-thread-1 这样不好看也没有什么意义,假如在线程里的子线程执行出错了查看日志的不能看出来哪个线程池,这样就不是很友好。那么怎么给线程池里的线程有意义的命名呢,咱们先了解一下java线程池默认名字是哪里来的,我以

Executors.newCachedThreadPool()为例,其他的都是一样的

发现都是调用Executors.defaultThreadFactory()方法,最终我们会走到Executors的静态内部类DefaultThreadFactory实现的

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- + 用当前工厂类创建的第几个线程池 + -thread-
        namePrefix = "pool-" +
                      poolNumber.getAndIncrement() +
                     "-thread-";
    }

    public Thread newThread(Runnable r) {
       //这里就是给线程命名的地方   namePrefix+当前线程池的第几个线程
        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;
    }
}

至此我们明白了默认的线程名是如何命名的,那么我们怎么自定义的,很简单我比葫芦画瓢就可以了

class NameTheadFactory 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;

   NameTheadFactory() {
      //默认namePrefix = default-name-pool
      this("default-name-pool");
   }

   NameTheadFactory(String name){
      SecurityManager s = System.getSecurityManager();
      group = (s != null) ? s.getThreadGroup() :
            Thread.currentThread().getThreadGroup();
//此时namePrefix就是 name + 第几个用这个工厂创建线程池的
      this.namePrefix = name +
            poolNumber.getAndIncrement();
   }

   public Thread newThread(Runnable r) {
      //此时线程的名字 就是 namePrefix + -thread- + 这个线程池中第几个执行的线程
      Thread t = new Thread(group, r,
            namePrefix + "-thread-"+threadNumber.getAndIncrement(),
            0);
      if (t.isDaemon())
         t.setDaemon(false);
      if (t.getPriority() != Thread.NORM_PRIORITY)
         t.setPriority(Thread.NORM_PRIORITY);
      return t;
   }
}

测试:

public static void main(String[] args) {
   final ThreadPoolExecutor zzhTestPool = new ThreadPoolExecutor(15, 60,
         5L, TimeUnit.MINUTES,
         new LinkedBlockingQueue<Runnable>(500), new NameTheadFactory("zzh-name-pool-"));
   for (int i = 0;i < 3;i++){
      zzhTestPool.execute(new Runnable() {
         @Override
         public void run() {
            System.out.println(Thread.currentThread().getName()+"||||----1");
         }
      });
   }
   final ThreadPoolExecutor zzhTestPool2 = new ThreadPoolExecutor(15, 60,
         5L, TimeUnit.MINUTES,
         new LinkedBlockingQueue<Runnable>(500), new NameTheadFactory());
   for (int i = 0;i < 3;i++) {
      zzhTestPool2.execute(new Runnable() {
         @Override
         public void run() {
            System.out.println(Thread.currentThread().getName() + "-->||||----1");
         }
      });
   }
   zzhTestPool.shutdown();
   zzhTestPool2.shutdown();
}

结果

zzh-name-pool-1-thread-2-->||||----1
zzh-name-pool-1-thread-3-->||||----1
zzh-name-pool-1-thread-1-->||||----1
pool2-thread-1-->||||----1
pool2-thread-2-->||||----1
pool2-thread-3-->||||----1

猜你喜欢

转载自blog.csdn.net/yueloveme/article/details/85048563