【问题标题】:why setName in Thread class assigns to a character array?why not a String?为什么 Thread 类中的 setName 分配给字符数组?为什么不是字符串?
【发布时间】:2012-05-02 11:01:26
【问题描述】:

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

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

private char name[]; // why not "private String name;"

setName()方法中,

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

请帮助我。提前致谢。

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

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

    2002 年的初步评估表明:

    “我无法想象这会严重影响任何 真正的节目。此外,更改 Thread 中的字段是 由于此类与 VM 的密切关系,存在问题。 也就是说,在某些情况下可能值得解决这个问题 线程代码清理。”

    然后在 2005 年因为“不会修复”而关闭:

    "名称表示为 char 数组存在依赖关系 在 JVM 中,必须恭敬地拒绝此 RFE。”

    【讨论】:

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

    我认为这很可能是一件历史文物;即很久以前出于不再相关的原因而完成的事情。

    正如 Curtisk 的评论所表明的,有人建议修复此问题。但听起来这些想法已经偏向一边,因为修复的努力超过了收益。很明显,修复这个异常的好处是微乎其微的……除非你创建了很多几乎没有实际工作的线程。

    RFE (4745629) 不再对 Google 可见,但 David Holmes @Oracle 的 this mailing list posting 引用了它:

    卢晓斌在 08/11/10 08:07 发表了如下言论:

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

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

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

    2002 年的初步评估表明:

    “我无法想象这会严重影响任何真实的 程序。此外,更改 Thread 中的字段是有问题的,因为 到这个类与VM的密切关系。也就是说,它 在某些线程代码清理的上下文中可能值得解决这个问题。”

    然后在 2005 年因为“不会修复”而关闭:

    "名称表示存在依赖关系,它是一个 char 数组 JVM 和这个 RFE 必须被恭敬地拒绝。”


    如您所知,同时更改 VM 和 Java 代码是一件非常痛苦的事情 协调,所以必须有一些引人注目的表现 支持这一点的证据(假设它可以改变)。我个人 同意上面的初始评估 - 如果 setName 影响你的整体 性能那么你的线程不能做太多的实际工作和 您似乎创建了太多线程-所以我会 有兴趣在这里更多地了解发生这种情况的背景。

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 2021-10-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多