【问题标题】:How to name the threads of a thread pool in Java [duplicate]如何在Java中命名线程池的线程[重复]
【发布时间】:2011-08-10 01:47:26
【问题描述】:

我有一个使用 Executor 框架的 Java 应用程序,并且我的代码看起来像这样 protected ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(5)

我的理解是 JVM 在内部会创建一个包含 5 个线程的池。现在,当我在分析器中检查执行情况时,我会得到 thread-pool2,thread-pool3 之类的信息。

Some of these thread pools are created by the server and some are created by me我需要一种方法来区分哪些是我创建的,哪些是服务器创建的

我在想,如果我可以命名线程池,它应该可以解决问题,但是没有看到任何 API 可以让我做同样的事情。

提前致谢。

【问题讨论】:

    标签: java multithreading threadpool executorservice


    【解决方案1】:
    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);
                    }
                });
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      使用您自己的自定义线程工厂。实现一个 ThreadFactoryBuilder 来创建您的自定义线程工厂,让您可以执行以下操作:

      1. 有自定义线程名称
      2. 可以选择线程 - 用户线程或守护线程
      3. 可以选择线程优先级
      4. 可以灵活地设置未捕获的异常处理程序

      您可以使用以下帖子中的示例 ThreadFactoryBuilder 实现。

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

      【讨论】:

        【解决方案3】:

        您可以将自己的ThreadFactory 传递给ScheduledThreadPoolExecutor。您的 ThreadFactory 将创建线程并可以给它任何您想要的名称。你的 ThreadFactory 也可以重用Executors.defaultThreadFactory(),并且只在返回线程前更改名称。

        【讨论】:

        • 如果您已经在使用 Guava,那么它的ThreadFactoryBuilder 可以让这变得非常简单。
        • @Joachim:哦,非常好。我确实使用番石榴,但我错过了那门课。谢谢!
        • 是否为线程池中的线程命名,与命名线程池本身相同?,我需要命名线程池,以便我可以开始在分析器中看到该名称 :)
        • @Sudarshan:线程池本身没有名字。只有线程有名称。 Profiler 向您显示线程,而不是池。
        • 是的,刚刚意识到谢谢 :)
        【解决方案4】:

        来自线程池执行器documentation

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2013-04-19
        相关资源
        最近更新 更多