थ्रेड इंटरप्ट मैकेनिज्म एक (सहयोग करने वाला) धागा प्राप्त करने का पसंदीदा तरीका है जो कि यह क्या कर रहा है इसे रोकने के अनुरोध का जवाब देता है। कोई भी धागा (मुझे लगता है कि धागा सहित) interrupt()
एक थ्रेड पर कॉल कर सकता है ।
व्यवहार में, interrupt()
किसी तरह के ढांचे या प्रबंधक को कुछ कार्यकर्ता थ्रेड को बताने के लिए सामान्य उपयोग के मामलों को रोकने के लिए कि वे क्या कर रहे हैं। यदि श्रमिक धागा "इंटरप्ट अवेयर" है, तो यह नोटिस करेगा कि यह एक अपवाद के माध्यम से बाधित किया गया है, या समय-समय पर अपने बाधित ध्वज की जांच कर रहा है। यह देखते हुए कि यह बाधित हो गया है, एक अच्छी तरह से व्यवहार किए गए धागे को छोड़ देना चाहिए जो यह कर रहा है और खुद को समाप्त कर रहा है।
उपरोक्त उपयोग-मामले को मानते हुए, यदि आपका कोड जावा फ्रेमवर्क में या कुछ वर्कर थ्रेड से चलाया जाता है, तो आपके कोड के बाधित होने की संभावना है। और जब यह बाधित होता है, तो आपके कोड को यह छोड़ देना चाहिए कि यह क्या कर रहा है और सबसे उपयुक्त साधनों द्वारा खुद को समाप्त करने का कारण बनता है। आपके कोड को कैसे बुलाया गया था, इस पर निर्भर करते हुए, यह वापसी या कुछ उपयुक्त अपवाद को फेंककर किया जा सकता है। लेकिन यह शायद फोन नहीं करना चाहिए System.exit()
। (आपके एप्लिकेशन को जरूरी नहीं पता है कि यह क्यों बाधित हुआ था, और यह निश्चित रूप से नहीं जानता है कि क्या अन्य धागे हैं जिन्हें रूपरेखा द्वारा बाधित करने की आवश्यकता है।)
दूसरी ओर, यदि आपका कोड कुछ ढांचे के नियंत्रण में चलाने के लिए डिज़ाइन नहीं किया गया है, तो आप तर्क दे सकते हैं कि InterruptedException
यह एक अप्रत्याशित अपवाद है; यानी एक बग। उस मामले में, आपको अपवाद का इलाज करना चाहिए क्योंकि आप अन्य कीड़े होंगे; उदाहरण के लिए इसे अनियंत्रित अपवाद में लपेटें, और इसे उसी बिंदु पर लॉग इन करें, जब आप अन्य अनियंत्रित अपवादों से निपटते हैं। (वैकल्पिक रूप से, आपका एप्लिकेशन केवल व्यवधान को अनदेखा कर सकता है और वही कर सकता है जो वह कर रहा था।)
1) यदि मैं कभी भी अन्य थ्रेड्स को अपने आप में बाधित नहीं कर रहा हूं, तो एक इंटरप्टेड अपवाद को कैसे ट्रिगर किया जा सकता है?
एक उदाहरण यदि आपका है Runnable
वस्तुओं का उपयोग कर क्रियान्वित कर रहे हैं ExecutorService
और shutdownNow()
सेवा पर कहा जाता है। और सिद्धांत रूप में, कोई भी 3-पार्टी थ्रेड पूल या थ्रेड मैनेजमेंट फ्रेमवर्क वैध रूप से ऐसा कुछ कर सकता है।
2) अगर मैं कभी भी अन्य धागों को बीच में रोक कर खुद को बाधित () नहीं कर रहा हूँ ... InterruptedException
तो इसका क्या मतलब है? एक को पकड़ने पर मुझे क्या करना चाहिए? शटडाउन माय ऐप?
आपको यह जानने के लिए कोडबेस का विश्लेषण करने की आवश्यकता है कि interrupt()
कॉल क्या और क्यों कर रहा है। एक बार जब आपको पता चल गया कि आप काम कर सकते हैं, तो आपके << ऐप का हिस्सा क्या करना है।
जब तक आप यह नहीं जानते कि क्यों InterruptedException
फेंका जा रहा है, मैं इसे एक कठिन त्रुटि मानने की सलाह दूंगा; उदाहरण के लिए, लॉग फ़ाइल में एक स्टैकट्रेस प्रिंट करें और ऐप को बंद करें। (जाहिर है, यह हमेशा सही जवाब नहीं है ... लेकिन मुद्दा यह है कि यह "बग" है, और इसे डेवलपर / अनुरक्षक के ध्यान में लाया जाना चाहिए।)
3) मुझे कैसे पता चलेगा कि कौन / क्या कॉल कर रहा है interrupt()
?
इसका कोई अच्छा जवाब नहीं है। सबसे अच्छा मैं सुझाव दे सकता हूं Thread.interrupt()
कि कॉल स्टैक पर एक ब्रेकपॉइंट सेट करें और देखें।