2012-06-13 7 views
7

का कहना है कि मैं निम्नलिखित करता हूं ...जावा: क्या होता है यदि थ्रेड में उपयोग किए जाने वाले रननेबल को शून्य पर सेट किया गया है?

// MyRunnable एक वर्ग है जिसे मैंने घोषित किया है, जो रननेबल लागू करता है।

MyRunnable r = new MyRunnable(); 
Thread t = new Thread(r); 
t.start(); 

r = null; 

उपरोक्त कोड स्निपेट में मेरे जैसे आर को सेट करने के प्रभाव क्या हैं?

+0

+1 नीचे दिए गए मेरे उत्तर पर एक नज़र डालें :) –

+0

@ Eng.Fouad Brilliant :) बहुत बहुत धन्यवाद! –

+0

आपका स्वागत है। साथ ही, यहां मेरे उत्तर पर एक नज़र डालें: http://stackoverflow.com/questions/9404625/java-pass-by-reference/9404727#9404727 –

उत्तर

7

मुझे आंकड़े के माध्यम से आप को यह स्पष्ट करने दें:

1- पर

MyRunnable r = new MyRunnable(); 

आप वर्ग MyRunnable जो ज्यादातर Runnable इंटरफ़ेस लागू करता है की नया उदाहरण बना रहे हैं:

enter image description here

2-

पर
Thread t = new Thread(r); 

आप एक नया धागा बनाने और मूल्य द्वारा उद्देश्य यह है कि संदर्भ आर की ओर इशारा करते है गुजर रहे हैं:

enter image description here

3- पर

r = null; 

आप निकाल रहे हैं आर संदर्भ और MyRunnable ऑब्जेक्ट के बीच लिंक, जो थ्रेड t थ्रेड चलाने के लिए उपयोग कर रहा है:

enter image description here

6

कोई प्रभाव नहीं।

थ्रेड पहले ही शुरू हो चुका है। और भले ही, थ्रेड ऑब्जेक्ट संदर्भ पर होगा, इसलिए t तक इसे कचरा नहीं मिलेगा।

+1

थ्रेड अभी तक शुरू नहीं होने पर भी कोई प्रभाव नहीं है, क्योंकि थ्रेड के पास स्वयं है रननेबल पर एक हैंडल भी ... – brimborium

+0

@brimborium True। मैं स्पष्ट करूंगा। – Jivings

3

कुछ भी नहीं।

परिवर्तनीय rMyRunnable ऑब्जेक्ट स्वयं ही नहीं है; यह कोड के आपके ब्लॉक के भीतर उस ऑब्जेक्ट पर केवल संदर्भ है।

प्रारंभ में आप एक नया MyRunnable ऑब्जेक्ट बनाते हैं। और फिर, आप इसे "नाम दें"/इसे वैरिएबल r पर असाइन करें। इसके बाद आप इसे Thread कन्स्ट्रक्टर में पास कर सकते हैं (वेरिएबल का उपयोग करके वर्णन करें कि आप किस ऑब्जेक्ट के बारे में बात कर रहे हैं)। उस कन्स्ट्रक्टर के भीतर, यह लगभग निश्चित रूप से अन्य संदर्भों को सौंपा जाएगा (जेडीके में मैं उपयोग कर रहा हूं, यह target नामक एक फ़ील्ड है)।

बाद में, आप अपने संदर्भ r को किसी अन्य ऑब्जेक्ट पर दोबारा दर्ज करें - इस मामले में, null ऑब्जेक्ट। इसका ऑब्जेक्ट पर कोई प्रभाव नहीं पड़ता है, यह संदर्भ को इंगित करता है, केवल संदर्भ। इसी प्रकार किसी अन्य वस्तु को इंगित करने वाले अन्य संदर्भों पर इसका कोई प्रभाव नहीं पड़ता है।

तो Thread.target संदर्भ अभी भी उसी MyRunnable ऑब्जेक्ट पर इंगित करता है जिसे आपने प्रारंभ में बनाया था, और थ्रेड के दृष्टिकोण से, कुछ भी नहीं बदला है।

एकमात्र संभावित अंतर यह है कि आपके (बाहरी) कोड स्निपेट में अब बनाए गए ऑब्जेक्ट का संदर्भ नहीं है। तो निम्नानुसार कोड उस ऑब्जेक्ट पर किसी भी तरीके को कॉल करने में सक्षम नहीं होगा, या इसे विधि तर्क आदि के रूप में पास नहीं करेगा। (यह कोई समस्या नहीं होनी चाहिए - या आश्चर्यजनक - यह देखते हुए कि आपने जानबूझकर उस ऑब्जेक्ट के अपने संदर्भ को निरस्त कर दिया है!)


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

इस मामले में, MyRunnable जीसीड नहीं होगा क्योंकि Thread अभी भी इसका संदर्भ रखता है।

कहा कि, अगर निर्माता अलग ढंग से व्यवहार और एक संदर्भ की दुकान है, क्योंकि यह एक (शायद यह सिर्फ toString() प्रतिनिधित्व करता है) की ज़रूरत नहीं थी नहीं करने के लिए थे, तो वस्तु नहीं पहुंचा जा सकता समझा जाएगा, और एकत्र किया जाएगा ।दोनों मामलों में कचरा कलेक्टर सही चीज करेगा - ऑब्जेक्ट इकट्ठा करना अगर केवल और कुछ भी नहीं तो इसका मतलब है - बिना किसी चिंता के या आपके कोड में इसके बारे में जानना।

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

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