2012-05-02 15 views
5

जब मैं जावा में थ्रेड्स अवधारणा से निपट रहा था, मैंने थ्रेड.जावा स्रोत फ़ाइल देखी है। मैंने देखा कि setName() विधि "name[]" नामक एक वर्ण सरणी को स्ट्रिंग निर्दिष्ट करती है। जावा में स्ट्रिंग डेटा प्रकार की एक विशेषता है, फिर वे चरित्र सरणी का उपयोग क्यों कर रहे हैं।क्यों थ्रेड क्लास में setName एक वर्ण सरणी को असाइन करता है? स्ट्रिंग क्यों नहीं?

स्रोत फ़ाइल में ऐसा initialised है,

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

setName() विधि में,

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

कृपया मेरी मदद करो। अग्रिम में धन्यवाद।

उत्तर

9

यह नाम मूल कोड से प्राप्त किया गया है, इसलिए जावा प्रकारों के साथ मैंगल से चार सरणी को संभालना आसान है। core-lib-devs मेलिंग सूची ने कुछ समय पहले इस प्रश्न पर चर्चा की, यहां थ्रेड से एक मेल पर link है। मूल प्रश्न में कहा गया है कि "उस थ्रेड.सेटनाम कॉल पर उचित समय लगता है जो मुझे लगता है कि एक महत्वपूर्ण हिस्सा नया चार आवंटन करना और चार सरणी आदि कॉपी करना है"। जवाब के टुकड़े का हवाला देते हुए:

वहाँ इस तरह के लिए एक RFE 2002 के अंत में वापस किया गया था:

4,745,629 (धागा) Thread.setName करता अनावश्यक स्ट्रिंग आवंटन (चार [] का उपयोग नहीं करते)

2002 में प्रारंभिक eval ने कहा:

"मैं कल्पना नहीं कर सकते कि इस गंभीरता से प्रभाव डालता है किसी भी वास्तविक कार्यक्रम का प्रदर्शन इसके अलावा, थ्रेड में क्षेत्रों को बदलने समस्याग्रस्त करीबी रिश्ता के कारण है। वीएम के साथ इस वर्ग का जहाज। कहा कि, यह कुछ थ्रेड कोड-सफाई के संदर्भ में इस को संबोधित लायक हो सकता है "

फिर 2005 में इसे के रूप में बंद हो गया" ठीक नहीं होगा। ":

" नाम पर निर्भरता रहे हैं प्रतिनिधित्व JVM में एक चार सरणी जा रहा है और इस RFE सम्मान से खारिज कर दिया जाना चाहिए "

+2

क्या आप इसे कुछ संदर्भ या कुछ के साथ वापस कर सकते हैं? मुझे 'Thread.java' या' Thread.c' ('मूल' पेड़ में) में कुछ भी दिखाई नहीं देता है जो नाम को मूल कोड तक पहुंच योग्य बनाता है। यदि इसे मूल कोड से एक्सेस किया गया था, तो मैं अंत में एक शून्य चरित्र देखने की उम्मीद करता हूं। यह अटकलों की तरह लगता है। –

+0

यह बहुत अच्छा प्रतिक्रिया था, धन्यवाद। क्या मैं विचार कर सकता हूं, यह एक कारण है, जावा शुद्ध वस्तु उन्मुख भाषा नहीं है? – kik

+1

@kik: ** संपूर्ण ** "जावा एक शुद्ध ओओ भाषा है" प्रश्न ** बेकार ** है क्योंकि कोई भी जिसने कभी यह नहीं पूछा वह एक "शुद्ध ओओ भाषा" की एक उपयोगी परिभाषा प्रदान करने में सक्षम था। मुझे गलत सिद्ध होना अच्छा लगेगा, लेकिन अब तक ऐसा नहीं हुआ है। –

4

मुझे लगता है कि यह सबसे अधिक संभावना एक ऐतिहासिक तथ्य है,। यानी कुछ है कि एक लंबे समय पहले कारण है कि नहीं रह रहे हैं के लिए किया गया था प्रासंगिक।

कर्टिस्क की टिप्पणी से संकेत मिलता है कि यह सुझाव दिया गया है कि यह तय किया जाए। लेकिन ऐसा लगता है जैसे विचार एक तरफ सेट किए गए हैं क्योंकि फिक्स को करने का प्रयास लाभ से अधिक है। और यह बहुत स्पष्ट है कि इस विसंगति को ठीक करने का लाभ छोटा है ... जब तक कि आप बहुत सारे धागे नहीं बनाते जो कम वास्तविक काम करते हैं।

RFE (4,745,629) अब गूगल को दिखाई देता है, लेकिन this mailing list posting डेविड होम्स @ ओरेकल द्वारा इसे करने के लिए संदर्भित करता है:

:

Xiaobin लू पर 08/11/10 08:07 निम्नलिखित कहा

आपके उत्तर के लिए धन्यवाद। कई एंटरप्राइज़ एप्लिकेशन (जैसे कि एक के लिए मैं काम करता हूं) के लिए, उस थ्रेड पर उचित समय लगता है।setName कॉल जो मेरा मानना ​​है कि एक महत्वपूर्ण हिस्सा नया चार आवंटन और कॉपी चार सरणी इत्यादि करना है, इसलिए मुझे लगता है कि हमें के बारे में दूसरा विचार देना चाहिए कि हम उस क्षेत्र को कुशलता से कैसे स्टोर कर सकते हैं।

वहाँ इस तरह के लिए एक RFE 2002 के अंत में वापस किया गया था:

4745629 (धागा) Thread.setName अनावश्यक स्ट्रिंग आवंटन

प्रारंभिक eval (नहीं उपयोग चार [] है) करता है 2002 में कहा गया है:

"मैं कल्पना नहीं कर सकते कि इस गंभीरता से प्रभाव डालता है किसी भी असली कार्यक्रम का प्रदर्शन इसके अलावा, थ्रेड में क्षेत्रों को बदलने के समस्याग्रस्त कारण टी के साथ इस वर्ग के करीबी रिश्ता है। वह वीएम। जैसा कि कहा गया है, यह कुछ थ्रेड कोड-सफाई के संदर्भ में इस को संबोधित लायक हो सकता है ठीक नहीं होगा "

फिर 2005 में इसे के रूप में बंद हो गया।" ":

" नाम प्रतिनिधित्व पर निर्भरता रहे हैं


जा रहा है में एक चार सरणी JVM और इस RFE सम्मान से खारिज कर दिया जाना चाहिए। "दोनों वी एम और जावा कोड, जैसा कि आप जानते हैं, एक असली दर्द समन्वय है बदल रहा है, इसलिए वहाँ करने के लिए होगा कुछ आकर्षक प्रदर्शन सुपर के लिए साक्ष्य हो यह बंदरगाह (मान लीजिए कि इसे बदला जा सकता है)। व्यक्तिगत रूप से मैं उपरोक्त प्रारंभिक eval से सहमत हूं - अगर सेटनाम आपके समग्र प्रदर्शन को प्रभावित कर रहा है तो आपके थ्रेड बहुत अधिक वास्तविक काम नहीं कर रहे हैं और आप बहुत अधिक धागे बना रहे हैं - इसलिए मैं रुचि रखूंगा संदर्भ के बारे में यहां और अधिक है जिसमें यह होता है।

संबंधित मुद्दे