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

我有一个使用该框架的Java应用程序,并且我有如下所示的代码Executorprotected 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。

提前致谢。


答案 1

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


答案 2
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);
                }
            });
    }

}