2008-10-22 24 views
25

मैं जावा में थ्रेडिंग के लिए अपेक्षाकृत नया हूं और मैंने देखा है कि हर बार जब मैं थ्रेड.sleep() का उपयोग करता हूं तो मुझे इंटरप्टेटेड अपवाद पकड़ना पड़ता है।किस प्रकार का व्यवहार बाधित अपवाद का कारण बनता है?

किस प्रकार का व्यवहार इसका कारण बनता है, और सरल अनुप्रयोगों में जहां मेरे पास मॉनिटर थ्रेड है, क्या मैं अपवाद को अनदेखा कर सकता हूं?

+0

इस सवाल का समान: http://stackoverflow.com/questions/17494717/why-a-thread-would-interrupt-another-thread/17495107#17495107 –

उत्तर

-3

ठीक है अगर कुछ अन्य थ्रेड thread.interupt() को कॉल करते हैं, जबकि थ्रेड सो रहा है, तो आपको अपवाद मिल जाएगा। और हां, आप शायद कोशिश कर सकते हैं .. नींद के चारों ओर देखो() और इसे अनदेखा करें;)

+19

डाउनग्रेड क्योंकि आप * * उपेक्षा कभी नहीं करना चाहिए कोई अपवाद, इससे अनियंत्रित व्यवहार और बग की ओर जाता है। या तो इसे लॉग करें, या इसे बबल करें। –

+0

एक इंटरप्टेड एक्सेप्शन निगलने से किसी एप्लिकेशन की गतिविधियों को रद्द करने या समय-समय पर जानकारी बंद करने की क्षमता से समझौता किया जाता है। यहां अधिक जानकारी http://www.ibm.com/developerworks/library/j-jtp05236/ –

+0

जबकि किसी को निश्चित रूप से अधिकांश अपवादों को अनदेखा नहीं करना चाहिए। यह एक अपवाद का एक प्रमुख उदाहरण है जिसे कुछ मामलों में अनदेखा किया जा सकता है। उदाहरण के लिए जब थ्रेड का संदर्भ केवल दायरे में मौजूद होता है तो कोई अप्रत्याशित व्यवहार संभव नहीं होता है। हम सॉफ्टवेयर इंजीनियरों हैं और खुद के लिए सोचना चाहिए। यदि आप खुद से यह भी नहीं पूछते कि अपवादों को संभालने का सर्वोत्तम अभ्यास क्यों है, तो आप शायद एक खराब इंजीनियर हैं। –

3

प्राथमिक मामला तब होता है जब कोई आपके धागे पर Thread.interrupt() पर कॉल करता है।

यदि आप वास्तव में इसकी अपेक्षा नहीं कर रहे हैं तो ऐसा होता है, लेकिन यह बहुत ही सरल मामलों के लिए आप शायद इसे अनदेखा कर सकते हैं, तो रनटाइम अपवाद को फेंकना सुरक्षित हो सकता है।

-1

इंटरप्टेडएक्सप्शन एक चेक अपवाद है इसलिए दुर्भाग्य से आप इसे अनदेखा नहीं कर सकते हैं। सबसे साधारण मामलों में आपको पकड़ खंड में कुछ भी करने की ज़रूरत नहीं है क्योंकि आप सुनिश्चित हैं कि ऐसा नहीं होगा।

एपीआई

फेंक दिया जब एक धागा, इंतज़ार कर रहा है सो, या अन्यथा से एक लंबे समय के लिए रोक दिया और एक अन्य धागा वर्ग थ्रेड में बाधा पद्धति का उपयोग करके यह व्यवधान।

3

javadocs से:

कक्षा InterruptedException

फेंक दिया जब एक धागा इंतज़ार कर रहा है, सो, या अन्यथा एक लंबे समय के लिए रोक दिया और एक अन्य धागा का उपयोग कर इसे बाधित क्लास थ्रेड में विधि को बाधित करें।

आशा है कि आपके प्रश्न का उत्तर दें।

5

जैसा कि अन्य ने कहा है, यह पर Thread ऑब्जेक्ट पर सोते हुए कुछ अन्य धागे के कारण होता है जो सो रहा है।

सादे अंग्रेजी में इसका क्या अर्थ है, यह है कि कुछ अन्य धागे ने सोने के थ्रेड को रद्द करने का निर्णय लिया है। कोशिश/पकड़ ब्लॉक वहां है ताकि आप थ्रेड को रद्द करने, और किसी भी संसाधन को सुरक्षित रूप से साफ कर सकें, या जो भी ऑपरेशन सही तरीके से कर रहे थे उसे बंद कर दें।

यदि आपको वास्तव में ऐसा करने की ज़रूरत नहीं है, तो हाँ, आपको अभी भी एक खाली पकड़ ब्लॉक की आवश्यकता है। लेकिन यह आपके लिए जावा है ...

23

ऐसा होता है जब कुछ थ्रेड पर interrupt() पर कॉल करता है। This article by Brian Goetz रुकावट तंत्र बताते हैं और कैसे आप InterruptedExceptions संभाल चाहिए:

"InterruptedException के लिए सबसे आम प्रतिक्रिया यह निगल करने के लिए है - यह पकड़ने और कुछ नहीं कर (या शायद यह प्रवेश करते है, जो किसी भी बेहतर नहीं है) - - जैसा कि हम बाद में लिस्टिंग 4 में देखेंगे।दुर्भाग्यवश, यह दृष्टिकोण इस तथ्य के बारे में महत्वपूर्ण जानकारी को फेंक देता है कि एक बाधा उत्पन्न हुई, जो गतिविधियों को रद्द करने या समय-समय पर बंद करने की एप्लिकेशन की क्षमता से समझौता कर सकती है। "

" यदि आप इंटरप्ट किए गए अपवाद को पकड़ते हैं लेकिन इसे पुनर्स्थापित नहीं कर सकते हैं, तो आपको सबूत बचाओ कि बाधा उत्पन्न हुई [...]। इस कार्य अभ्यास में जावा संगामिति से बाधा() वर्तमान धागा "reinterrupt" को फोन करके पूरा किया है "

+2

इस बिंदु को लाने के लिए धन्यवाद। यह एक PITA है जिसे इंटरप्टेड एक्सेप्शन प्रबंधित करना है, लेकिन यह महत्वपूर्ण है। –

6

कुछ सलाह:।

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