2014-11-11 12 views
11

जावा के InterruptedException के बारे में दिलचस्प प्रश्न और उत्तर हैं, उदाहरण के लिए The Cause of InterruptedException और Handling InterruptedException in Java। हालांकि, उनमें से कोई भी मुझे interruptedException के संभावित स्रोतों के बारे में बताता है।बाधित अपवाद: इसका कारण क्या है?

एसआईजीटरएम, सिग्क्विट, सिगिनट जैसे ओएस सिग्नल के बारे में क्या? क्या कमांड लाइन पर CTRL-C दबाकर एक इंटरप्टेड एक्सेप्शन उत्पन्न होता है? और क्या?

+0

यह आलेख आपको इस तंत्र को समझने में मदद कर सकता है: [आप इंटरप्टेड एक्सेप्शन के साथ क्या करते हैं?] (Http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256

उत्तर

16

आपके द्वारा सूचीबद्ध की जाने वाली कोई भी चीज़ InterruptedException उत्पन्न करती है।

एकमात्र चीज जो थ्रेड को बाधित कर सकती है वह Thread#interrupt() पर कॉल है। JLS मामले पर अपेक्षाकृत स्पष्ट है, section 17.2.3 से:

17.2.3 व्यवधान

रुकावट कार्यों जैसे Thread.interrupt के आह्वान पर पाए जाते हैं, साथ ही तरीकों परिभाषित बदले में यह आह्वान करने के लिए, ThreadGroup.interrupt

कुछ और जानकारी के लिए the official tutorial on interrupts देखें। विशेष रूप से:

एक धागा Thread वस्तु पर interrupt लागू के लिए धागा बाधित किया द्वारा व्यवधान भेजता है। बाधा तंत्र को सही तरीके से काम करने के लिए, बाधित धागे को अपने स्वयं के व्यवधान का समर्थन करना चाहिए।

...

बाधा तंत्र एक आंतरिक बाधा स्थिति रूप में जाना जाता ध्वज का उपयोग कर कार्यान्वित किया जाता है। Thread.interrupt का आह्वान इस ध्वज को सेट करता है। जब कोई धागा स्थैतिक विधि Thread.interrupted का आविष्कार करके किसी बाधा की जांच करता है, तो स्थिति को बाधित कर दिया जाता है। गैर स्थैतिक isInterrupted विधि, जिसे किसी थ्रेड द्वारा किसी अन्य की इंटरप्ट स्थिति की क्वेरी करने के लिए उपयोग किया जाता है, इंटरप्ट स्थिति ध्वज को नहीं बदलता है।

सम्मेलन द्वारा, InterruptedException फेंकने से निकलने वाली कोई भी विधि ऐसा होने पर बाधा स्थिति को साफ़ करती है। हालांकि, यह हमेशा संभव है कि interrupt का आह्वान करने वाले किसी अन्य थ्रेड द्वारा इंटरप्ट स्थिति तुरंत सेट की जाएगी।

निहितार्थ यह है कि यह केवल interrupt() बुला के बजाय अन्य अज्ञात बाहरी घटनाओं से चालू होने से एक स्पष्ट झंडा settable है। यह आगे विभिन्न तरीकों कि यह, for example (जोर मेरा) फेंक में अपवाद का वर्णन द्वारा निहित है:

InterruptedException - यदि कोई धागा वर्तमान धागा बाधित कर दिया है। इस अपवाद को फेंकने पर वर्तमान धागे की बाधित स्थिति साफ़ हो जाती है।


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

InterruptedException को संभालने के बारे में आपको कई नोट्स और "चेतावनियां" दिखाई देती हैं, इसका मतलब यह नहीं है कि उन्हें पूरी तरह से स्वचालित रूप से फेंक दिया जा सकता है, वे अच्छी तरह से डिज़ाइन की गई वस्तुओं को प्रोत्साहित करने के लिए हैं जिसका उपयोग उन संदर्भों में किया जा सकता है जो अभी तक ज्ञात नहीं हैं , जहां interrupt() काम करने के लिए माना जाएगा (वास्तव में, आप मानना ​​चाहते हैं कि अगर आप पुन: प्रयोज्य वस्तुओं को बना रहे हैं तो भविष्य में परिस्थितियों में मजबूत रहेगा - यानी आप कभी गारंटी नहीं देते हैं कि आपका कोड नहीं होगा कुछ दिन किसी ऐसे व्यक्ति द्वारा उपयोग किया जाए जो काम करने में बाधाओं की अपेक्षा करता हो)।

त्वरित एक बंद परियोजनाओं के लिए

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

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