36

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

4 回答 4

48

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

于 2011-04-21T06:45:26.787 回答
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);
                }
            });
    }

}
于 2015-03-13T16:36:02.207 回答
9

从 ThreadPoolExecutor文档中:

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

于 2011-04-21T06:47:54.033 回答
0

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

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

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

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

于 2014-09-12T11:06:19.747 回答