面试官:如何自定义一个工厂类给线程池命名,我:现场手撕吗?

面试场景模拟

面试官:小伙子平时开发中用过线程池吗?聊一聊它

我:肯定用过啊,然后把build的线程池十八问一顿巴拉巴拉

面试官:不错不错,挺了解的嘛,那你知道怎么给线程池命名?手写一个工厂类给线程池命名吧

我:啊这,现场手撕吗?面试官默默的递上A4...


   如何给线程池命名?这是一个好问题,如果我们的项目模块较多,在运行时调用了不同模块的线程池,为了在发生异常后快速定位问题,我们一般会在构建线程池时给它一个名字,这里我们提供几种线程池命名的方法。

方法一: 通过Spring 框架提供的CustomizableThreadFactory命名

java 复制代码
ThreadFactory springThreadFactory = new CustomizableThreadFactory("Spring线程池:");
ExecutorService exec = new ThreadPoolExecutor(1, 1,
         0L, TimeUnit.MILLISECONDS,
         new LinkedBlockingQueue<Runnable>(10),springThreadFactory);
 exec.submit(() -> {
     log.info(exec.toString());
 });

方法二: 通过Google guava工具类提供的ThreadFactoryBuilder命名

java 复制代码
//链式调用
ThreadFactory guavaThreadFactory = new ThreadFactoryBuilder().setNameFormat("guava线程池:").build();
ExecutorService exec = new ThreadPoolExecutor(1, 1,
          0L, TimeUnit.MILLISECONDS,
          new LinkedBlockingQueue<Runnable>(10),guavaThreadFactory );
  exec.submit(() -> {
      log.info(exec.toString());
  });

   其实还有一个是Apache commons-lang3 提供的 BasicThreadFactory工厂类,也可以给线程池命名,咱这里就不贴代码了,原因是他们的本质都是通过Thread 的setName()方法实现的!所以,我们其实自己也可以设计一个工厂类也实现线程池的命名操作!

方法三: 自定义工厂类实现线程池命名

先定义一个工厂类,通过实现ThreadFactory的newThread方法,完成命名。

java 复制代码
public class MyThreadFactory implements ThreadFactory {

    private final AtomicInteger threadNum = new AtomicInteger();
    private final String name;

    /**
     * 创建一个带名字的线程池生产工厂
     */
    public MyThreadFactory(String name) {
        this.name = name;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setName(name + "-" + threadNum.incrementAndGet());
        return t;
    }
}

调用一下看看结果:

java 复制代码
@Slf4j
public class Test {
    public static void main(String[] args) {
        MyThreadFactory myThreadFactory = new MyThreadFactory("javaBuild-pool");
        ExecutorService exec = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<Runnable>(10),myThreadFactory);
        exec.submit(() -> {
            log.info(exec.toString());
        });
    }
}

输出:

java 复制代码
17:46:37.387 [javaBuild-pool-1] INFO com.javabuild.server.pojo.Test - java.util.concurrent.ThreadPoolExecutor@1ee7d6d6[Running, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
相关推荐
现任明教教主~4 分钟前
SpringBoot+Vue学生宿舍管理系统源码 带部署文档
vue.js·spring boot·后端
2501_933670797 分钟前
2027校招销售运营面试:大数据管理与应用专业如何拆解漏斗分析
大数据·人工智能·面试
panxianren5 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
码事漫谈7 小时前
骂AI,会让它做得更好吗?
后端
sunshine22 girl7 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
丑陋小蚊子7 小时前
邮件投简历,正文和附件各写什么?
面试·求职招聘·大学生·简历·简历下载
陈随易7 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
省钱兄--zs7 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang8 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
架构技术专栏8 小时前
学习率:一次参数更新,到底应该改多少
面试