Java 为什么线程类中的setName分配给字符数组?为什么不是字符串?

Java 为什么线程类中的setName分配给字符数组?为什么不是字符串?,java,Java,当我在Java中处理线程概念时,我看到了Thread.Java源文件。我注意到,setName()方法将字符串分配给名为“name[]”的字符数组。Java有一个字符串数据类型的特性,那么为什么他们使用字符数组呢 在源文件中,它被初始化为 private char name[]; // why not "private String name;" 在setName()方法中 public final void setName(String name) { checkAccess();

当我在Java中处理线程概念时,我看到了Thread.Java源文件。我注意到,
setName()
方法将字符串分配给名为
“name[]”
的字符数组。Java有一个字符串数据类型的特性,那么为什么他们使用字符数组呢

在源文件中,它被初始化为

private char name[]; // why not "private String name;"
setName()
方法中

public final void setName(String name) {
    checkAccess();
    this.name = name.toCharArray();
    }

请帮帮我。提前感谢。

此名称是从本机代码访问的,因此处理字符数组比处理Java类型更容易。
core lib devs
邮件列表不久前讨论了这个问题,下面是一封来自该线程的一对一邮件。最初的问题是“Thread.setName调用花费了相当多的时间,我认为其中很大一部分是进行新的字符分配和复制字符数组等”。引用部分答案:

早在2002年末,就有一个这样的RFE:

4745629(thread)thread.setName不进行不必要的字符串分配 (不要使用字符[])

2002年的初步评估表明:

“我无法想象这会严重影响任何一家公司的业绩 此外,更改线程中的字段也很重要 由于此类与VM的密切关系,因此存在问题。 也就是说,在某些情况下解决这一问题可能是值得的 线程代码清理。”

然后在2005年,它被关闭为“不会修复”:

“名称表示形式与字符数组之间存在依赖关系 在JVM中,必须尊重地拒绝此RFE。”


我认为这很可能是一件历史文物;i、 很久以前出于不再相关的原因所做的事情

正如柯蒂斯克的评论所指出的那样,有人建议对此进行修正。但这听起来像是把想法放在了一边,因为进行修复的努力超过了收益。很明显,纠正这种反常现象的好处微乎其微。。。除非你正在创建大量的线程,而这些线程做的实际工作很少

RFE(4745629)不再为谷歌所见,但由David Holmes@Oracle引用:

卢晓斌在2010年8月11日08:07说了以下话:

谢谢你的回复。对于许多企业应用程序(例如 一个我的工作),相当多的时间花在了Thread.setName调用上 我认为其中很大一部分是进行新的字符分配和 复制字符数组等,所以我认为我们应该再考虑一下 我们如何有效地存储该字段

早在2002年末,就有一个这样的RFE:

4745629(thread)thread.setName执行不必要的字符串分配(不 使用char[])

2002年的初步评估表明:

“我无法想象这会严重影响任何一家房地产公司的业绩 此外,更改线程中的字段是有问题的,因为 这个类与虚拟机的密切关系。也就是说,它 可能值得在某些线程代码清理的上下文中解决此问题。”

然后在2005年,它被关闭为“不会修复”:

“名称表示形式与中的字符数组存在依赖关系 必须尊重地拒绝JVM和此RFE。”


正如您所知,同时更改VM和Java代码对于 协调,所以必须有一些引人注目的表现 支持这一点的证据(假设可以更改)。我个人 同意上面的初始评估-如果setName影响您的总体 那么你的线程就不能做太多的实际工作了 你似乎创建了太多的线程——我也是 有兴趣在此了解更多有关发生这种情况的上下文


你能用一些参考资料或其他东西来证明这一点吗?我在
Thread.java
Thread.c
(在
native
树中)中没有看到任何使本机代码可以访问该名称的内容。如果它是从本机代码访问的,我希望在末尾看到一个空字符。这似乎是猜测。这是很好的回应,谢谢。我能认为,这是java不是纯面向对象语言的原因之一吗?@ KIK:整个“java是纯OO语言”问题是没有用的,因为从来没有人问过它能提供什么定义“纯OO语言”的有用定义。我很想被证明是错的,但到目前为止还没有发生。如果你在网上四处看看,你会发现这个问题是在大约10年前提出的,显然有一个RFE(4745629)来解决这个问题……当时的想法是,为了将其存储为字符串,他们必须将JVM更改与API更改同步,我猜这被认为太过分了,因为线程是一种流行的object@curtisk:如果您能找到该参考资料,您应该发布带有链接和引用的答案。:-)