最近处理应用性能问题时分析栈帧时发现部分线程名称为类似 pool-15-thread-2841 的模式,经过排查,原因为开发创建自定义线程池时未指定线程工厂导致,默认会使用 Executors.defaultThreadFactory()
实现。
如开发调用 Executors.newFixedThreadPool(int)
方法时,相关源码为:
1 | /** |
其中 java.util.concurrent.ThreadFactory
接口的声明为:
1 | /** |
为了便于应用诊断时定位问题线程,我们建议创建自定义线程池时指定一个线程工厂用于指定新建线程的名称,比如我们的工具类中有这样一个线程工厂用于指定名称:
1 | import java.util.concurrent.ThreadFactory; |
类似的实现在 dubbo、lucence、sentinel、guava 等开源项目中都能看到,如: