2011-07-12 22 views
21

मान लें कि मुख्य विधि से धागा शुरू किया गया है। क्या होता है अगर धागे में एक अपवाद फेंक दिया जाता है लेकिन थ्रेड के भीतर नहीं संभाला जाता है?जावा थ्रेड अपवाद

क्या अपवाद को मुख्य विधि में वापस प्रसारित करना संभव है?

उत्तर

32

हम Thread.run विधि से अनचेक अपवादों के बारे में बात कर रहे हैं। डिफ़ॉल्ट रूप से, आप सिस्टम त्रुटि में इस तरह sth मिल जाएगा:

Exception in thread "Thread-0" java.lang.RuntimeException 
    at Main$1.run(Main.java:11) 
    at java.lang.Thread.run(Thread.java:619) 

यह बिना क्रिया अपवाद के लिए printStackTrace का परिणाम है। इसे संभाल करने के लिए, आप अपने खुद के UncaughtExceptionHandler जोड़ सकते हैं: सभी धागे के लिए एक स्थिर विधि Thread.setDefaultUncaughtExceptionHandler का उपयोग

Thread t = new Thread(new Runnable(){ 
     public void run() { 
      throw new RuntimeException(); 
     }  
    }); 
    t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("exception " + e + " from thread " + t); 
     } 
    }); 
    t.start(); 

हैंडलर सेट करने के लिए।

केवल धागा है जिसमें यह
0

यदि अपवाद को try {} catch (Exception e){} द्वारा नियंत्रित नहीं किया जाता है तो इसे उठाया जाता है और जिसे फंक्शन कहा जाता है।

यदि यह अलग स्टैंडअलोन धागा है, तो आप इसे आपत्ति उठाने का जो धागा

या यहाँ कुछ अन्य जानकारी के जनक नहीं है प्रचार नहीं कर सकते हैं: How to throw a checked exception from a java thread?

0

आम तौर पर, आप अपवाद अपने आप को लागू नहीं करते हैं, जब कुछ अपवाद होता है, तो यह निष्पादन बंद कर देता है।

+0

। असल में, एकाधिक थ्रेड अलग-अलग प्रक्रियाओं की तरह कार्य कर सकते हैं जो डेटा को आसानी से (आसानी से) करते हैं। अलग प्रक्रियाओं और साझा स्मृति का उपयोग कर सटीक एक ही मॉडल (कुछ मुश्किल से) बनाया जा सकता है। –

3

नहीं, यह नहीं हो सकता है। जब आप इसके बारे में सोचते हैं, तो main() विधि दिन पहले समाप्त हो सकती है।

धागे से कोई भी अपवाद अपवाद थ्रेड के UncaughtExceptionHandler पर प्रचारित है। यदि कोई परिभाषित नहीं है, तो यह थ्रेड समूह के हैंडलर पर जाता है, अगर यह सेट नहीं है, तो यह डिफ़ॉल्ट हैंडलर पर जाता है।

+0

पहली पंक्ति होती है 'दिनों ago' बेहतर मुद्दे को समझने के मददगार था के बारे में अपने जवाब में की – kevinarpe

0

अपवाद UncaughtExceptionHandler द्वारा पकड़ा गया है। यदि आप चाहें तो इसे मुख्य थ्रेड पर वापस प्रसारित कर सकते हैं।

5

यदि अपवाद पकड़ा जाता है और उस थ्रेड में चल रहे कोड द्वारा संभाला जाता है, तो इसे संभाला जाएगा हालांकि catch ब्लॉक तर्क लिखा गया है। मैं इस बाकी के जवाब के लिए मान लेगा कि आप बेजोड़ अपवादों के बारे में बात कर रहे हैं।

एक बेजोड़ अपवाद थ्रेड को बाहर निकलने का कारण बनता है। जब यह Thread.run() के शीर्ष पर बुलबुले हो जाता है तो इसे थ्रेड के UncaughtExceptionHandler द्वारा नियंत्रित किया जाएगा। डिफ़ॉल्ट रूप से, यह केवल कंसोल पर स्टैक ट्रेस प्रिंट करेगा। थ्रेड स्वयं इस बिंदु से बाहर निकल जाएगा - यह वास्तव में वैसे भी जारी नहीं हो सका, क्योंकि इसकी run() विधि समाप्त हो गई है।

तो अगर आप चाहते हैं अपवाद अपने मुख्य थ्रेड में reraised जा करने के लिए, आप एक UncaughtExceptionHandler परिभाषित कर सकते हैं कि यह कर देगा (यह एक बहुत ही सरल अंतरफलक है), और फिर पैदा धागे पर Thread.setUncaughtExceptionHandler फोन के बाद इसे बनाया है, में गुजर अपने कस्टम अपवाद हैंडलर।


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

(हैं, तो दूसरी ओर अपने मुख्य थ्रेड सिर्फ अन्य थ्रेड, तो यह आसान हो जाता है चलाने के लिए इंतज़ार कर रहा है पर। लेकिन इस मामले में, शायद अपने मुख्य धागा एक पिरोया ExecutorService करने के लिए एक कार्य प्रस्तुत करने और पर अवरुद्ध होना चाहिए Future, जो आपके लिए इस वायरिंग/लाइफसाइकिल सामान को संभालेगा?)

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