我认为这很可能是历史文物;即很久以前出于不再相关的原因而完成的事情。
正如 Curtisk 的评论所表明的,有人建议修复此问题。但听起来这些想法已经偏向一边,因为修复的努力超过了收益。很明显,修复这个异常的好处是微乎其微的……除非你创建了很多几乎没有实际工作的线程。
RFE (4745629) 不再对 Google 可见,但David Holmes @ Oracle发布的这个邮件列表引用了它:
卢晓斌在 08/11/10 08:07 说:
感谢您的回复。对于很多企业应用程序(比如我工作的那个),相当多的时间都花在了 Thread.setName 调用上,我相信其中很大一部分是进行新的字符分配和复制字符数组等。所以我认为我们应该重新考虑我们如何有效地存储该字段。
早在 2002 年末就有一次这样的 RFE:
4745629(线程)Thread.setName 进行不必要的字符串分配(不要使用 char[])
2002 年的初步评估表明:
“我无法想象这会严重影响任何实际程序的性能。此外,由于此类与 VM 的密切关系,更改 Thread 中的字段是有问题的。也就是说,在上下文中解决这个问题可能是值得的一些线程代码清理。”
然后在 2005 年它被关闭为“不会修复”:
“名称表示在 JVM 中是一个 char 数组,因此必须尊重地拒绝这个 RFE。”
如您所知,同时更改 VM 和 Java 代码确实很难协调,因此必须有一些令人信服的性能证据来支持这一点(假设可以更改)。就我个人而言,我同意上面的初始评估 - 如果 setName 正在影响你的整体性能,那么你的线程不能做太多的实际工作,而且你似乎创建了太多的线程 - 所以我有兴趣在这里更多地了解发生这种情况的上下文。