15

我正在开发一个项目,该项目正在慢慢变得越来越大,并且许多不同进程使用的活动线程数量正在增加。最近,我一直在仔细查看调试器中正在运行的线程,我注意到我的很多第三方库都给他们的线程起了很差的名字——Timer-0、qtp0 等。我希望其他开发人员不熟悉使用名称不佳的线程可以立即知道正在运行的内容。

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

4

7 回答 7

11

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

至于这是否是一个好主意,目前尚无定论,但是除了人类可读的描述之外,依赖线程名称是一个非常糟糕的决定,而且大多数库都不会这样做。因此,如果您重命名它们,则不太可能破坏任何东西。

于 2009-01-21T22:15:32.980 回答
9

更改 Java 线程名称

Thread.currentThread().setName("MyThread");
于 2016-09-27T06:24:54.523 回答
6

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

我同意带有名称不佳的线程的 3rd 方库会使您更难以理解您的应用程序中正在发生的事情。但是从 3rd 方库中重命名线程是有风险的。如果他们的下一个版本改变了他们命名线程的方式会发生什么?以及如何处理根本不尝试命名线程的第 3 方库?

编辑:添加从末尾以某种方式消失的文本

于 2009-01-22T05:02:26.293 回答
5

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

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

于 2009-01-26T05:00:16.037 回答
3

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

我不能告诉你这是否是一个好主意,但我可能倾向于“不”。您编写的代码越多,您必须维护的代码就越多。

于 2009-01-21T22:13:36.603 回答
1

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

于 2009-01-21T22:18:22.647 回答
1

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

于 2009-04-17T13:25:53.533 回答