ThreadPoolExecutor中运行线程名称的修改

在项目中使用ThreadPoolExecutor时,发现默认线程名称不便调试。本文探讨如何改变线程池中线程的默认名称,使其更具可读性,方便在开发阶段快速定位问题。分析了defaultThreadFactory的源码,并揭示了线程复用导致名称无法更改的问题。解决方案是在run方法的第一行设置线程名称。
摘要由CSDN通过智能技术生成

项目中使用到了ThreadPoolExecutor,这个是挺好的东西,线程池的实现。但有一点不太爽的是,用Jprofiler调试由它创建的线程的时候,看到的都是pool-1-thread-1\2\3\4之类的。这是它自身的默认规则产生的,pool代表这是池,-1-代表是第几个ThreadPoolExecutor产生的,-thread-1是递增的。

所以每次我都要点 Thread Dumps 去查看线程执行的具体的代码与堆栈信息,推测是哪个地方出的问题。虽然说也能看出来,但很不直观嘛。于是有了一个想法,能不能不要用它的默认名称,由我自己的设定线程的名字,这样就一目了然了。把idea和master王说了,觉得也是个好主意。当然就只是在开发阶段有帮助,系统稳定上线后就没有用了。

 Executors.defaultThreadFactory()是缺省的创建线程的实现。看下源码,

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
之所以在工具中看到所有的线程都
ThreadPoolExecutor ,可以通过自定义线程工厂来设置线程名称线程工厂是一个对象,其主要作用是创建新线程,并将其配置为所需的属性,比如设置线程名称。 下面是一个示例代码,展示了如何设置 ThreadPoolExecutor线程名称: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; public class Main { public static void main(String[] args) { // 创建自定义的线程工厂 ThreadFactory threadFactory = new ThreadFactory() { private int counter = 0; @Override public Thread newThread(Runnable runnable) { counter++; return new Thread(runnable, "MyThread-" + counter); } }; // 创建 ThreadPoolExecutor设置线程工厂 ExecutorService executorService = Executors.newFixedThreadPool(5, threadFactory); // 执行任务 for (int i = 0; i < 10; i++) { executorService.execute(() -> { System.out.println("Thread name: " + Thread.currentThread().getName()); }); } // 关闭线程池 executorService.shutdown(); } } ``` 在上面的示例,我们创建了一个自定义的线程工厂 `threadFactory`,每次创建新线程时,会自动增加计数器并设置线程名称为 "MyThread-" 加上计数器的值。 然后,我们使用 `Executors.newFixedThreadPool()` 方法创建了一个固定大小的线程池,并将自定义的线程工厂传递给它。 最后,我们提交了10个任务给线程池执行,并在任务打印了线程名称运行上述代码,你会看到输出线程名称类似于 "MyThread-1"、"MyThread-2"、"MyThread-3" 等。这样,我们就成功地设置ThreadPoolExecutor线程名称
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值