2010-03-19 14 views
12

मैं समझता हूं कि एक इंटरप्टेड एक्सेप्शन क्या करता है और इसे क्यों फेंक दिया जाता है। हालांकि मेरे आवेदन में मुझे यह मिलता है कि SwingUtilities.invokeAndWait() के लिए थ्रेड पर केवल एक थ्रेड पर प्रतीक्षा किया जाता है, और मेरा एप्लिकेशन कभी भी किसी भी थ्रेड पर Thread.interrupt() पर कॉल नहीं करता है, यह कभी भी किसी भी थ्रेड के संदर्भ को कभी भी पास नहीं करता है।कौन मेरे धागे को बाधित करता है?

तो मेरा सवाल है: मेरे धागे को किसने बाधित किया?

क्या कोई बताने का कोई तरीका है? क्या कोई कारण है कि InterruptedException में थ्रेड का नाम नहीं है जो बाधा का अनुरोध करता है?

मैंने पढ़ा है यह एक रूपरेखा या लाइब्रेरी से करता है कि, हम निम्न का उपयोग हो सकता है, लेकिन मैं कारण नहीं सोच सकते हैं उन्हें अपने धागा बाधित करने के लिए के लिए:

  • हाइबरनेट
  • स्प्रिंग
  • Log4J
  • Mysql कनेक्टर
+8

मुझे लगता है कि आपका मतलब है "कौन * डेर * मेरे धागे को बाधित करता है?" –

+2

+1 - क्या आप थ्रेड # शामिल कर रहे हैं? यह interruptedException फेंकता है। – RubyDubee

+0

वास्तव में स्कॉट, मैं अपने धागे को बाधित नहीं करना चाहूंगा (क्योंकि मैं वैसे भी अनुरोध का पालन नहीं करना चाहता)। हम थ्रेड नहीं करते हैं # खुद से जुड़ें, लेकिन मैं कल्पना कर सकता हूं कि invokeAndWait ऐसी तंत्र का उपयोग करता है। हालांकि, क्या थैड # किसी अन्य धागे पर एक बाधा उत्पन्न करेगा? इसके अलावा मुझे पूरा यकीन है कि कोई भी मेरे धागे को पूरा करने की प्रतीक्षा नहीं करता है (जैसा कि यह कभी नहीं होगा)। – Thirler

उत्तर

11

यदि संभव हो, तो आप Thread का विस्तार कर सकते हैं और interrupt() विधि को इस थ्रेड के लिए एक स्टैकट्रैक मुद्रित करने या असमर्थित ऑपरेशन अपवाद फेंकने के लिए ओवरराइट कर सकते हैं।

आप इंटरप्टिंग थ्रेड के संदर्भ को संग्रहीत करने के लिए विस्तारित Thread कक्षा का भी उपयोग कर सकते हैं और बाधित अपवाद को पकड़ने के बाद इसे पढ़ सकते हैं।

2

यहाँ कुछ अजीब है।

invokeAndWait की जावाडोक से, एक InterruptedException जबकि doRun.run excecuting खत्म करने के लिए धागा भेजने घटना के लिए इंतजार

फेंक दिया जाता है अगर हम बाधित कर रहे हैं()

आप करने की कोशिश की है देखें कि क्या ईडीटी में निष्पादित कोड कोई अपवाद भेजता है? या उस ईडीटी में कोड इस धागे के कुछ चर को संशोधित करने का प्रयास करता है (मुझे पता है कि यह शब्द जावा भाषा में "रूढ़िवादी" नहीं है, लेकिन मुझे आशा है कि आप देखेंगे कि मेरा क्या मतलब है: कोई कोड सिंक्रनाइज़, प्रतीक्षा, शामिल, ...

+0

में होता है यदि रननेबल हम अपवाद फेंकने की प्रतीक्षा कर रहे हैं तो इसे एक आमंत्रण लक्ष्यीकरण अपवाद देना चाहिए, जो मामला नहीं है। यह संभव है कि इंतज़ार करते समय हमारे धागे का तालाब हो, क्या इसका कारण हो सकता है? मुझे यकीन है कि हमारे पास डेडलॉक नहीं है। जिस धागे का हम इंतजार करते हैं वह एक संवाद बनाता है जिसे हम प्रतीक्षा धागे में उपयोग करते हैं। – Thirler

4

सामान्य में, अगर आप को पता है जो कुछ कर रहा है चाहता हूँ,, एक डिबगर देते हैं एक ब्रेकपाइंट रखा, और वहाँ तुम जाओ। यदि आप इसे पुन: पेश कर सकते हैं अनुमान लगाने के लिए कोई ज़रूरत नहीं!

इस मामले में, आप कर सकते हैं Thread.interrupt() पर एक ब्रेकपॉइंट डालें। यदि अन्य धागे भी बाधित हो रहे हैं (इसलिए आपके पास ब्रेकपॉइंट पर "झूठी सकारात्मक" हिट है), तो आप ब्रेकपॉइंट की स्थिति जोड़ सकते हैं (अधिकांश आईडीई आपको आसानी से ऐसा करने की अनुमति देता है), उदाहरण के लिए धागे के नाम की जांच।

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