如何在Java中为线程池命名线程

36

我有一个使用Executor框架的Java应用程序,代码如下:

protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)

我的理解是JVM内部会创建一个包含5个线程的线程池。但是,当我在分析器中检查执行情况时,得到了诸如“thread-pool2,thread-pool3”等内容。

其中一些线程池是由服务器创建的,而另一些则是我创建的我需要找到一种区分哪些是我创建的、哪些是服务器创建的方法

我认为,如果我能给这些线程池命名,就可以解决问题,但是没有找到可以实现这一点的API。

提前感谢。

4个回答

48

13
如果您已经在使用Guava,那么它的ThreadFactoryBuilder可以让这变得非常简单。 - Joachim Sauer
@Joachim: 哇,太棒了。我确实使用 Guava,但是我错过了那个类。谢谢你! - Peter Štibraný
在线程池中为一个线程命名,是否等同于给线程池本身命名?我需要给线程池命名,以便在分析器中可以看到该名称 :) - Sudarshan
1
@Sudarshan:线程池本身没有名称,只有线程有名称。Profiler向您显示线程而不是线程池。 - Peter Štibraný
噢,我刚意识到了。谢谢 :) - Sudarshan

12
public class NamedThreadPoolExecutor extends ThreadPoolExecutor {

private static final String THREAD_NAME_PATTERN = "%s-%d";

    public NamedThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, final TimeUnit unit,
                               final String namePrefix) {
       super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>(),
            new ThreadFactory() {

                private final AtomicInteger counter = new AtomicInteger();

                @Override
                public Thread newThread(Runnable r) {
                    final String threadName = String.format(THREAD_NAME_PATTERN, namePrefix, counter.incrementAndGet());
                    return new Thread(r, threadName);
                }
            });
    }

}

9

来自ThreadPoolExecutor文档

创建新线程 使用ThreadFactory创建新线程。如果未指定其他选项,则使用Executors.defaultThreadFactory(),它创建的所有线程都在同一ThreadGroup中,并具有相同的NORM_PRIORITY优先级和非守护进程状态。通过提供不同的ThreadFactory,您可以更改线程的名称、线程组、优先级、守护进程状态等。如果ThreadFactory在从newThread返回null时无法创建线程,则执行程序将继续运行,但可能无法执行任何任务。


例如,请参见https://dev59.com/sW025IYBdhLWcg3wRDq8#6113794 - rogerdpack

0
使用自定义的线程工厂。实现一个ThreadFactoryBuilder来创建您的自定义线程工厂,使您可以执行以下操作:
  1. 具有自定义线程名称
  2. 可选择线程类型 - 用户或守护线程
  3. 可选择线程优先级
  4. 灵活设置未捕获异常处理程序

您可以在以下帖子中找到一个示例ThreadFactoryBuilder实现,您可以使用它。

http://wilddiary.com/understanding-java-threadfactory-creating-custom-thread-factories/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接