如何给可调用线程命名?


问题内容

我正在使用ExecutorService线程池执行Callable Object。我想给这个线程起个名字。

更具体地说,在旧版本中,我这样做了-

Thread thread = new Thread(runnable Task);
thread.setName("My Thread Name");

我在log4j日志记录中使用线程名,这在进行故障排除时会很有帮助。现在,我将代码从Java 1.4迁移到Java
1.6。我已经写了这个(下面给出)-但是我不知道如何给这个线程命名。

private final ExecutorService executorPool = Executors.newCachedThreadPool();
Future<String> result = executorPool.submit(callable Task);

请给我一些想法给这个线程命名?


问题答案:

您可以使用重载方法:

java.util.concurrent.Executors.newCachedThreadPool(ThreadFactory)

这可以让您通过

java.util.concurrent.ThreadFactory

应该允许您通过以下方式设置线程的名称java.util.concurrent.ThreadFactory.newThread(Runnable)

构造一个新的Thread。实现也可以初始化优先级,名称,守护程序状态ThreadGroup等。

看一下java.util.concurrent.Executors.DefaultThreadFactory默认实现。

附录

由于我看到仍在访问该线程,因此Guava(如果有)可提供 ThreadFactoryBuilder,它利用了内部匿名类的需求,甚至允许自定义线程的参数化名称。