搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 程序猿探索之路 > 线程池---友好的线程池命名

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

程序猿探索之路 2019-01-07
举报

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

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

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

是这样的

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

public ThreadPoolExecutor(int corePoolSize,
                         int
maximumPoolSize,
                         long
keepAliveTime,
                         
TimeUnit unit,
                         
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
       
Executors.defaultThreadFactory(), defaultHandler);
}


发现都是调用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


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《线程池---友好的线程池命名》的版权归原作者「程序猿探索之路」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注程序猿探索之路微信公众号

程序猿探索之路微信公众号:hard_programmer

程序猿探索之路

手机扫描上方二维码即可关注程序猿探索之路微信公众号

程序猿探索之路最新文章

精品公众号随机推荐

举报