命名 ExecutorService 的线程和线程池

新手上路,请多包涵

假设我有一个使用 Executor 框架的应用程序

Executors.newSingleThreadExecutor().submit(new Runnable(){
    @Override
    public void run(){
        // do stuff
    }
}

当我在调试器中运行此应用程序时,将创建一个具有以下(默认)名称的线程: Thread[pool-1-thread-1] 。如您所见,这并不是非常有用,据我所知, Executor 框架没有提供一种简单的方法来命名创建的线程或线程池。

那么,如何为线程/线程池提供名称呢?例如, Thread[FooPool-FooThread]

原文由 mre 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 684
2 个回答

您可以提供 ThreadFactorynewSingleThreadScheduledExecutor(ThreadFactory threadFactory) 。工厂将负责创建线程,并能够为它们命名。

引用 Javadoc

创建新线程

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

原文由 NPE 发布,翻译遵循 CC BY-SA 4.0 许可协议

Guava 几乎总能满足您的 需求

 ThreadFactory namedThreadFactory =
  new ThreadFactoryBuilder().setNameFormat("my-sad-thread-%d").build()

并将其传递给您的 ExecutorService

原文由 pathikrit 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题