2012-03-22 10 views
5

जब विभिन्न थ्रेड एक स्थिर विधि तक पहुंचते हैं, तो उस विधि में ऑब्जेक्ट्स को घोषित किया जाता है या जावा में धागे के बीच साझा किया जाता है?जब विभिन्न थ्रेड एक स्थिर विधि तक पहुंचते हैं, तो उस विधि में स्थानीय या साझा किए गए ऑब्जेक्ट्स जावा

साथ ही, क्या यह thread.interrupt() को थ्रेड पर कॉल करना सुरक्षित है जो i/o कर रहा है?

+3

वे दो अलग-अलग प्रश्न हैं और दो अलग-अलग पदों में पूछे जाने चाहिए। – Jeffrey

+0

एक स्थिर विधि –

+1

में io कर रहे थ्रेड पर thread.interrupt को कॉल करना अभी भी दो अलग-अलग प्रश्न हैं। – Jeffrey

उत्तर

8

static विधि के अंदर घोषित ऑब्जेक्ट्स धागे के बीच साझा नहीं किए जाते हैं। static के रूप में विधि के बाहर परिभाषित ऑब्जेक्ट्स साझा किए गए हैं।

तो:

private static Object thisIsShared; 

public static void myMethod() { 
    Object thisIsNotShared = new Object(); 
} 

आप धागे मैं कर रही पर interrupt() बुला जा करने के लिए जा रहे हैं/हे आप कक्षाओं कि the InterruptableChannel interface कार्यान्वित करते हैं पर गौर करना चाहिए।

1

एक स्थैतिक विधि में घोषित चर को धागे के बीच साझा नहीं किया जाता है। जब कोई स्थैतिक विधि किसी स्थिर या अन्यथा साझा वस्तुओं को संशोधित नहीं करता है, तो यह थ्रेडसेफ है - जिसका अर्थ है कि कई धागे विधि का आह्वान कर सकते हैं और कुछ भी बुरा नहीं होगा।

Looking here, धागे को बाधित करते समय बहुत सी चीजें गलत हो सकती हैं। लेकिन ऐसा लगता है कि धागा एक स्थैतिक विधि का आह्वान करने जैसा नहीं है उनमें से एक है। मै गलत हो सकता हूँ।

+0

'स्थिर' के साथ इसके साथ कुछ लेना देना नहीं है। – EJP

2
बाधा() के बारे में

->

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

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

1

सही उत्तर है: स्थैतिक बनाम गैर स्थैतिक, इससे कोई फर्क नहीं पड़ता।

स्थानीय चर हमेशा विधि के उस आमंत्रण के लिए स्थानीय होते हैं, भले ही विधि स्थिर है या नहीं। वे स्टैक पर आवंटित किए जाते हैं और विधि निकलने के बाद स्टैक (और बिना विचार-विमर्श) से पॉप आउट हो जाते हैं।

अपने दूसरे प्रश्न के लिए के रूप में, डॉक्स पढ़ें,

http://developer.android.com/reference/java/lang/Thread.html

यदि आप उपयोग कर रहे गैर-अवरुद्ध आईओ, तो हाँ बुला interrupt() भावना आप क्या उम्मीद पर निर्भर करता है (फिर से कर सकते हैं , दस्तावेज़ पढ़ें)। यदि आप आईओ को अवरुद्ध कर रहे हैं, तो interrupt() पर कॉल करने से कोई प्रभाव नहीं पड़ेगा।

1

thread.interrupt() पर एक थ्रेड पर कॉल करना सुरक्षित है जब तक I/O interruptable channel पर किया जा रहा है।

इस सूत्र एक व्यवधान कारक चैनल तो चैनल बंद कर दिया जाएगा पर एक आई/ओ आपरेशन में अवरुद्ध है, तो धागा की बाधा स्थिति की स्थापना की जाएगी, और धागा एक ClosedByInterruptException प्राप्त होगा।

अनुसार java.lang.Thread

1

अलग धागे एक स्थितिक प्रणाली वस्तुओं कि विधि स्थानीय या जावा में धागे के बीच साझा घोषित किये गए हैं का उपयोग करते हैं?

किसी विधि में घोषित ऑब्जेक्ट विधि के लिए स्थानीय हैं। यह कोई फर्क नहीं पड़ता कि विधि स्थिर है या जो भी हो।

1

स्थैतिक या गैर स्थैतिक विधि में घोषित चर विभिन्न धागे के बीच साझा नहीं किए जाते हैं।

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