如何为可调用线程命名?

我正在使用执行器服务线程池执行可调用对象。我想给这个线程一个名字。

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

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);

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


答案 1

我目前的做法有点像这样:

    someExecutor.execute(new Runnable() {
        @Override public void run() {
            final String orgName = Thread.currentThread().getName();
            Thread.currentThread().setName(orgName + " - My custom name here");
            try {
                myAction();
            } finally {
                Thread.currentThread().setName(orgName);
            }
        }
    });

答案 2

您可以使用重载方法:

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

它允许您通过

java.util.concurrent.ThreadFactory

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

构造一个新的 .实现还可以初始化优先级、名称、守护程序状态等。ThreadThreadGroup

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

补遗

由于我看到这个线程仍然被访问,Guava(如果你有它可用的话)提供了一个ThreadFactoryBuilder,它利用了拥有内部匿名类的需求,甚至允许自定义线程的参数化名称。