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

时间:2011-04-21 06:41:11

标签: java multithreading threadpool executorservice

我有一个使用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。

提前致谢。

4 个答案:

答案 0 :(得分:46)

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

答案 1 :(得分:10)

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 :(得分:8)

来自ThreadPoolExecutor documentation

  

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

答案 3 :(得分:0)

使用您自己的自定义线程工厂。实现ThreadFactoryBuilder以创建自定义线程工厂,允许您执行以下操作:

  1. 拥有自定义线程名称
  2. 可以选择线程 - 用户或守护程序线程
  3. 可选择线程优先级
  4. 可灵活设置未捕获的异常处理程序
  5. 您可以使用以下帖子中的示例ThreadFactoryBuilder实现。

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