थ्रेड क्लास को विस्तारित करके उपयोगकर्ता को थ्रेड बनाने की अनुमति देने का सार क्या है जब हम रननेबल को लागू करके समान थ्रेड कन्स्ट्रक्टर को पास कर सकते हैं।java.lang क्यों है। जावा में थ्रेड क्लास डिजाइनरों द्वारा अंतिम रूप से चिह्नित नहीं है?
उत्तर
Thread
असामान्य है कि यह Runnable
को चलाने के लिए संदर्भ ले सकता है, लेकिन यह स्वयं भी Runnable
है। डिफ़ॉल्ट रूप से, Thread
खुद को Runnable
उदाहरण के रूप में उपयोग करने के लिए उपयोग करेगा, बेशक आप इसे कहीं और इंगित कर सकते हैं।
मुझे लगता है कि है कि या तो निशान Thread
अंतिम करने के लिए कोई अच्छा कारण नहीं है और Thread
लचीला बनाने के लिए एक बाहरी Runnable
या आवश्यकता होती है और यह अपने आप ही Runnable
होना है। दोनों दृष्टिकोण पूरी तरह से ठीक हैं और न ही दूसरे की तुलना में एक बेहतर विकल्प की तरह लगता है।
Thread t = new Thread() {
public void run() {
/* ... your code here ... */
}
};
कौन सा Runnable
का एक उपवर्ग बनाने और फिर एक में यह लपेटकर से मामूली रूप से क्लीनर है:
तो मुझे लगता है कि करने के लिए किया था, Thread
subclassable बनाने के लिए कारण यह है कि यह आप इस तरह कोड लिखने की अनुमति देता है धागा। इसी प्रकार, Runnable
प्राप्त करने के लिए आप Thread
से उप-वर्ग को घटा सकते हैं जो स्पष्ट रूप से इंगित करता है कि इसे थ्रेड के रूप में उपयोग किया जाना चाहिए। बेशक, यह ज्यादातर सौंदर्यशास्त्र का सवाल है, और जावा डिजाइनर इस तरह से दूसरे तरीके से चले गए थे, मुझे लगता है कि यह एक बिल्कुल अच्छा निर्णय होगा।
एक ध्यान देने योग्य अंतर यह है कि यदि आपकी कक्षा ए को कक्षा बी (अन्य थ्रेड) का विस्तार करने की आवश्यकता है और एक ही समय में एक धागा हो, तो इसे रननेबल को लागू करना होगा।
विस्तार थ्रेड के उपयोग Runnable तक सीमित नहीं है Runnable को लागू करने द्वारा ही कार्यक्षमता को प्राप्त करने और धागा निर्माता यह लिए गुजरती हैं। उदाहरण के लिए आप change the behavior of some methods कर सकते हैं या अपनी खुद की थ्रेड स्थानीय जानकारी जोड़ सकते हैं (हमेशा Thread.currentThread()
के साथ सुलभ)।
+1 ग्रेट विचार .. – Daniel
मैं कुछ जोड़ने, विस्तार Thread
आप एक धागा की कार्यक्षमता (जो Runnable
में मौजूद नहीं है, क्योंकि यह केवल run()
विधि शामिल हैं) अपने धागा एक डेमॉन धागा के रूप में कार्य करने के लिए अनुमति की तरह विस्तार किया है सकते हैं द्वारा ACAN हैं (बस कचरा कलेक्टर डेमॉन थ्रेड की तरह)। अन्य थ्रेड एक गैर-डिमन थ्रेड की तरह मौजूद हैं जो मुख्य कक्षा के तरीके (जब JVM प्रारंभ होता है) को कॉल करता है।
Runnable
इंटरफ़ेस आपकी कक्षा को थ्रेड के रूप में सक्रिय होने की अनुमति देता है (run()
विधि लागू करके)।
एक ऐतिहासिक परिप्रेक्ष्य से, आपको यह समझने की आवश्यकता है कि Thread
एपीआई जावा 1.0 में डिज़ाइन किया गया था, जावा अज्ञात आंतरिक कक्षाओं का समर्थन करने से पहले। और प्रारंभिक उदाहरण कोड में से बहुत से Thread
के उप-वर्गीकरण को दिखाता है। यह तब तक नहीं था जब तक:
- उन्होंने अज्ञात आंतरिक कक्षाओं (जावा 1) के लिए समर्थन जोड़ा।1)
- वे पता लगा यह इनर क्लासों (आदि) का उपयोग करने के
Runnable
उदाहरणों - वे कार्य निष्पादन, धागा पूल और इतने पर के लिए मानक वर्गों कार्यान्वित (जावा 5.0) प्रदान करने के लिए बेहतर था।
यह सब बहुत अच्छी तरह से कहा, "नेट में थ्रेड वर्ग अंतिम चिह्नित है", लेकिन आप को एहसास है कि सी # है/नेट बाद के वर्षों के एक नंबर साथ आया था ... और करने में सक्षम था जावा के डिजाइन से सीखें। जावा पुराने कोड को तोड़ने के लिए अनिवार्य अनिवार्य होने की वजह से कई कम से कम सही डिजाइन निर्णयों के ऐतिहासिक सामान के साथ अटक गया था।
थ्रेड क्लास वर्णन करता है कि थ्रेड कैसे चलता है, रननेबल बताता है कि क्या चल रहा है। यदि आप जो भी चलाना चाहते हैं उसे संशोधित करना चाहते हैं, तो आपको रननेबल को लागू करना चाहिए। यदि आप संशोधित करना चाहते हैं कि थ्रेड कैसे चलाया जाता है तो आप थ्रेड से प्राप्त होते हैं। उस स्थिति में जहां आप संशोधित करना चाहते हैं कि थ्रेड कैसे चलाया जाता है, आप थ्रेड से प्राप्त कर सकते हैं और एक अलग रननेबल ऑब्जेक्ट को कार्यान्वित कर सकते हैं।
एकमात्र अच्छी चीज जो मैं सोच सकता हूं वह है: यदि आप थ्रेड क्लास का विस्तार करते हैं, तो यह आपके रन() विधि को संरक्षित के रूप में चिह्नित करने देता है। एक रननेबल को लागू करने का नुकसान यह है कि आपकी रन विधि को सार्वजनिक के रूप में चिह्नित किया जाना चाहिए।
- 1. जावा क्लास में थ्रेड सुरक्षा
- 2. जावा में "अंतिम" के रूप में स्थानीय चर और विधि पैरामीटर को क्यों चिह्नित करेगा?
- 3. क्यों थ्रेड क्लास में setName एक वर्ण सरणी को असाइन करता है? स्ट्रिंग क्यों नहीं?
- 4. जावा समरूपता: अंतिम फ़ील्ड (कन्स्ट्रक्टर में प्रारंभ) थ्रेड-सुरक्षित है?
- 5. जावा में स्ट्रिंग क्लास Iterable लागू क्यों नहीं करता है?
- 6. जावा एनम अंतिम क्यों नहीं हो सकता है?
- 7. java.lang है। खुद को थ्रेड-सुरक्षित कक्षा पढ़ें?
- 8. जावा में अंतिम() कैसे काम करता है?
- 9. क्या जावा सिंगलटन क्लास में आवश्यक अंतिम कीवर्ड है?
- 10. जावा क्लास थ्रेड द्वारा शुरू किया गया है जो इसे पहली बार उपयोग करता है?
- 11. डिफ़ॉल्ट रूप से जावा अस्थिरता में चर क्यों नहीं हैं?
- 12. सभी अज्ञात वर्ग क्यों अंतिम रूप से अंतिम हैं?
- 13. जावा में @Implements एनोटेशन क्यों नहीं है?
- 14. जावा का यूआरएल क्लास कुछ प्रोटोकॉल क्यों नहीं पहचानता है?
- 15. थ्रेड में चलने योग्य रननेबल क्यों संभव नहीं है?
- 16. java.util.Scanner क्लास को 'अंतिम' क्यों घोषित किया गया है?
- 17. जावा में स्विच स्टेटमेंट में केस के रूप में अंतिम वैरिएबल क्यों हो सकता है?
- 18. जावा में रीगेक्स द्वारा अंतिम सूचकांक खोजें
- 19. ऑब्जेक्ट सदस्य परिवर्तक जावा में अंतिम और अस्थिर दोनों क्यों नहीं हो सकता है?
- 20. क्यों क्लास क्लास में रिसोर्सएस्ट्रीम विधि है?
- 21. जावा में अंतिम रूप देने का उद्देश्य क्या है?
- 22. जावा संदेशफॉर्मैट क्लास थ्रेड सुरक्षित है? (SimpleDateFormat के विपरीत)
- 23. जावा ईई कंटेनर में स्पॉन्गिंग थ्रेड क्यों हतोत्साहित है?
- 24. थ्रेड-सुरक्षित क्यों नहीं पढ़ रहा है?
- 25. ReadOnlyDictionary थ्रेड-सुरक्षित क्यों नहीं है?
- 26. रुबी की डेट क्लास स्वचालित रूप से लोड क्यों होती है लेकिन डेटटाइम नहीं है?
- 27. थ्रेड को IDISposable लागू क्यों नहीं किया जाता है?
- 28. एक वैरिएबल को अंतिम रूप में चिह्नित करने से आंतरिक कक्षाओं तक पहुंचने की अनुमति मिलती है?
- 29. वर्तमान संस्कृति क्यों थ्रेड की संपत्ति है?
- 30. जावा में मुख्य विधि को थ्रेड क्यों निकाला जाता है?
यह वाक्यविन्यास की भावना में क्लीनर है, लेकिन डिज़ाइन की भावना में क्लीनर नहीं है और वर्तमान क्लास लोडर को अनलोड किए जाने पर क्रूर प्रभाव (परम जीन रिसाव) हो सकता है (उदा। ऐप सर्वर में)। –
@ पियोटर, कक्षा कचरा और सभी स्थैतिक जाज, दुर्भाग्यवश, थ्रेड को ओवरराइड करके हल नहीं किया जाएगा, सीसीएल को मृत धागे पर भी संदर्भ के रूप में रखा जाता है, जो अकेले पर्याप्त नुकसान पहुंचा सकता है। विरासत में पहुँचने के लिए कंट्रोल और रननेबल चलने वाले थ्रेड पर रखा जाता है, इसलिए बड़ा अंतर इमो। – bestsss
धागे को ओवरराइड करने से कुछ प्रभाव पड़ते हैं, जैसे खतरनाक धागे उप-वर्गों पर ट्रैक रखना (जैसे ओवरराइड/setContextClassLoader()) जिसके परिणामस्वरूप कुछ अतिरिक्त संचालन और सिंक्रनाइज़ेशन होते हैं। 'Thread.isCCLOverridden (कक्षा)' – bestsss