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

Sud*_*han 33 java multithreading executorservice threadpool

我有一个使用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允许我这样做.

提前致谢.

Pet*_*aný 47

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

  • 如果你已经在使用Guava,那么它的[`ThreadFactoryBuilder`](http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/util/concurrent/ThreadFactoryBuilder.html)就可以了这很简单. (12认同)

Kar*_*ról 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);
                }
            });
    }

}
Run Code Online (Sandbox Code Playgroud)


noa*_*amt 8

从ThreadPoolExecutor 文档:

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