2012-05-02 55 views
5

當我在Java中處理線程概念時,我看到了Thread.java源文件。我注意到當setName()方法將字符串分配給稱爲"name[]"的字符數組。 Java具有String數據類型的特性,那麼他們爲什麼使用字符數組。爲什麼Thread類中的setName分配給一個字符數組?爲什麼不是一個String?

在源文件時,它被初始化一樣,

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

setName()方法,

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

請幫助我。提前致謝。

回答

9

該名稱是從本機代碼訪問的,所以處理char數組比使用Java類型更容易。前面的core-lib-devs郵件列表討論了這個問題,這裏是link來自線程的一封郵件。原來的問題表明,「相當多的時間去到那個Thread.setName調用,我相信一個重要的部分是做新的字符分配和複製字符數組等」。引用答案位:

有在2002年底是爲這樣的RFE回:

4745629(線程)Thread.setName確實不用串分配 (不使用的char [])

在2002年最初的EVAL聲明:

「我無法想象,這嚴重影響了任何 真正的程序的性能。此外,在調線領域是 問題由於密切的關係。這個班的船與VM。 這就是說,它可能是值得一些 線程代碼清理的情況下解決這一「

然後在2005年,它被封閉,‘不會解決。’:

」上有名字的依賴表示是一個字符數組 在JVM,這RFE必須恭敬地拒絕「

+2

你可以支持一些參考或東西嗎?我在Thread.java或Thread.c中沒有看到任何東西(在'native'樹中)讓本機代碼可以訪問該名稱。如果它是從本機代碼訪問的,我期望在最後看到一個空字符。這似乎是猜測。 –

+0

這是很好的迴應,謝謝。我可以考慮,這是其中一個原因,java不是純粹的面向對象的語言嗎? – kik

+1

@kik:**整個**「Java是純粹的OO語言」問題是**無用的**,因爲沒有人問過它能夠提供一個有用的定義,說明究竟是什麼構成了「純粹的OO語言」。我很想被證明是錯誤的,但到目前爲止它還沒有發生。 –

4

我認爲這是最有可能是歷史遺留;即的東西,做一個很久以前的不再理由有關

正如Curtisk的評論所指出的那樣,有人建議這是固定的。但聽起來這些想法已被設置在一邊,因爲做出修復的努力超出了收益。很明顯,修復這個問題的好處是微乎其微的......除非你創建了很多沒有什麼實際工作的線程。

的RFE(4745629)不再是谷歌可見,但this mailing list posting由大衛·霍姆斯@甲骨文是指它:

曉斌魯說在08/11/10 08:07如下:

感謝您的回覆。對於很多企業應用程序(例如我爲之工作的 ),相當多的時間用於該主題。setName調用 ,我相信一個重要的部分是做新的字符分配和 複製字符數組等。所以我認爲我們應該再次考慮 如何有效地存儲該字段。

有人支持這樣的RFE早在2002年底:

4745629(線程)Thread.setName確實不用串分配(不 使用的char [])

初始EVAL在2002年指出:

「我無法想象,這嚴重影響了任何實際 程序的性能。此外,在調線領域是有問題的,由於 這一類T的密切關係。他VM。這就是說,它 可能是值得在某些線程代碼清理的情況下解決這一「

然後在2005年,它被封閉,‘不會解決。’:

」上有名字表示的依賴是在 字符數組的JVM,這RFE必須恭敬地拒絕。」


同時更改虛擬機和Java代碼,如你所知,一個真正的痛苦 協調,所以就必須有一些令人信服的表現 佐證端口這個(假設它可以改變)。我個人 與初始EVAL以上同意 - 如果是setname可以影響你的整體性能 那麼你的線程不能做太多的實際工作和 你似乎要創建遠線程太多 - 所以我會 興趣這裏更多地介紹這種情況。

相關問題