代码之家  ›  专栏  ›  技术社区  ›  Elijah

在Java中重命名线程

  •  16
  • Elijah  · 技术社区  · 17 年前

    我正在做一个项目,这个项目正慢慢变得越来越大,许多不同进程使用的活动线程数量也在增加。最近,我一直在仔细研究调试器中正在运行的线程,我注意到我的许多第三方库给它们的线程起了非常糟糕的名字——Timer-0、qtp0等。我希望其他不熟悉命名不佳的线程的开发人员能够立即知道正在运行什么。

    与其为我们正在使用的库编写补丁,有人知道如何重命名正在运行的线程吗?或者,这是否是一个好主意?如有任何建议,我们将不胜感激。

    7 回复  |  直到 17 年前
        1
  •  10
  •   erickson    17 年前

    是的,您可以使用以下命令更改线程的名称 setName() 方法。

    至于这是否是一个好主意,目前还无法确定,但依赖线程名称进行人类可读描述以外的任何操作都是一个非常糟糕的决定,大多数库都不会这样做。因此,如果你重命名它们,它不太可能破坏任何东西。

        2
  •  8
  •   KunMing Xie    9 年前

    更改Java线程名称

    Thread.currentThread().setName("MyThread");
    
        3
  •  6
  •   Eddie    17 年前

    如果问题出在开源库中,那么最好的解决方案是为这些产品提供补丁,以更好地命名线程。除非安全管理器正在运行,否则您可以通过枚举线程(如其他人所述)并为每个线程应用任意名称来重命名任何线程,但这是一种命名非您自己的线程的脆弱方式。如果第三方库更改了它们的命名,则必须更改代码。

    我同意,第三方库中线程命名不好会使理解应用程序中发生的事情变得更加困难。但是从第三方库重命名线程是有风险的。如果他们的下一个版本更改了线程的命名方式,会发生什么?您如何处理一个完全不尝试命名线程的第三方库?

    编辑:添加从末尾消失的文本

        4
  •  5
  •   Dustin    17 年前

    我为我创建的所有线程命名。我有太多的应用程序线程泄漏,或者线程失控。

    你越把java当作一个操作系统,它就越容易管理。 :)

        5
  •  3
  •   Sumit Singh phluid    14 年前

    您可以使用 Thread.enumerate() Thread.getAllStackTraces() 以获取正在运行的线程列表。然后,您可以致电 Thread.setName() 在每一个。

    我不能告诉你这是不是个好主意,但我可能会倾向于“不”。你写的代码越多,需要维护的代码就越多。

        6
  •  1
  •   McGovernTheory    17 年前

    这就引出了围绕线程命名约定的最佳实践问题。我还没有看到这方面的任何社区指导。

        7
  •  1
  •   Sumit Singh phluid    14 年前

    setName() 可以用来更改线程的名称,但你必须有某种方法来确定应该调用什么线程。
    getAllStackTraces() 将允许程序以堆栈跟踪为例,并使用类/方法/文件名作为调用线程的提示。

    推荐文章