假设我有一个使用 Executor
框架的应用程序
Executors.newSingleThreadExecutor().submit(new Runnable(){
@Override
public void run(){
// do stuff
}
}
当我在调试器中运行此应用程序时,将使用以下(默认)名称创建一个线程: Thread[pool-1-thread-1]
. 正如您所看到的,这并不是非常有用,据我所知, Executor
框架并没有提供一种简单的方法来命名创建的线程或线程池 .
那么,如何为线程/线程池提供名称呢?例如, Thread[FooPool-FooThread]
.
14 回答
Guava 几乎总是有你的need .
把它传递给你
ExecutorService
.您可以尝试提供自己的线程工厂,它将创建具有适当名称的线程 . 这是一个例子:
您还可以在执行线程时更改线程的名称:
例如,如果您将不同类型的任务用于相同的ThreadFactory,那么这可能是有意义的 .
你可以提供ThreadFactory到newSingleThreadScheduledExecutor(ThreadFactory threadFactory) . 工厂将负责创建线程,并且能够命名它们 .
引用Javadoc:
来自apache commons-lang的BasicThreadFactory对于提供命名行为也很有用 . 您可以使用Builder根据需要命名线程,而不是编写匿名内部类 . 这是来自javadocs的示例:
对于Oracle来说,这是一个open RFE . 根据Oracle员工的评论,似乎他们没有解决问题 . 这是JDK中支持简单易用的东西之一(没有破坏向后兼容性),因此RFE被误解是一种耻辱 .
正如所指出的,你需要实现自己的ThreadFactory . 如果你不想仅仅为了这个目的而引入Guava或Apache Commons,我在这里提供了一个你可以使用的
ThreadFactory
实现 . 它与您从JDK获得的内容完全相似,除了能够将线程名称前缀设置为"pool"之外的其他内容 .当您想要使用它时,您只需利用所有
Executors
方法允许您提供自己的ThreadFactory
这一事实 .这个
将给出一个ExecutorService,其中线程名为
pool-N-thread-M
但是使用了你会得到一个ExecutorService,其中的线程名为
primecalc-N-thread-M
. 瞧!如果您使用的是Spring,则可以使用CustomizableThreadFactory设置线程名称前缀 .
例:
将ThreadFactory传递给 Actuator 服务器,你很高兴
一种快速而肮脏的方法是在
run()
方法中使用Thread.currentThread().setName(myName);
.延长ThreadFactory
public interface ThreadFactory
Thread newThread(Runnable r)
示例代码:
输出:
....等等
您可以编写自己的ThreadFactory实现,例如使用一些现有的实现(如defaultThreadFactory)并在最后更改名称 .
实现ThreadFactory的示例:
用法:
这是我的定制工厂,为线程转储分析器提供自定义名称 . 通常我只是给
tf=null
重用JVM默认的线程工厂 . This website has more advanced thread factory.为方便起见,这是一个用于调试目的的线程转储循环 .
我用来做同样的事情(需要
guava
库):