2009-07-28 16 views
11

यदि मैं थ्रेड पर रन() विधि का आह्वान करता हूं और रन() विधि एक बेजोड़ अपवाद फेंकता है तो परिणाम क्या होगा?क्या होता है जब एक थ्रेड अपवाद फेंकता है?

इस अपवाद को कौन पकड़ता है? क्या यह भी पकड़ा जाता है?

+5

यह और स्पष्ट करने के लिए - आप रन() को नहीं बुलाते हैं - आप थ्रेड पर प्रारंभ() को कॉल() विधि को चलाने में कोड बनाने के लिए कहते हैं धागा। रनिंग() को सीधे चलाना सिर्फ मौजूदा थ्रेड में रन विधि निष्पादित करता है। – Nate

उत्तर

8

यदि थ्रेड ग्रुप के लिए कोई अपवाद हैंडलर स्थापित है, तो JVM इसके अपवाद को पास करता है। यदि यह एक एडब्ल्यूटी थ्रेड है, तो आप अन्यथा अनचाहे अपवादों के लिए इवेंट हैंडलर इंस्टॉल कर सकते हैं। अन्यथा JVM इसे संभालता है।

एक कस्टम हैंडलर के साथ एक धागा समूह का उदाहरण है और यह कैसे उपयोग करने के लिए:

public class MyExceptionHandler { 
    public void handle(Throwable ex) { 
     // Handle exception 
    } 
    public void handle(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName()); 
+3

"अन्यथा जेवीएम इसे संभालता है।" अधिक सटीक होने के लिए, अपवाद उठाए गए थ्रेड चुपचाप मर जाएंगे। –

+0

@ स्टीफन: असल में यह stderr के अपवाद को प्रिंट करता है। – Draemon

+0

वास्तव में? यह तब JVM विशिष्ट होना चाहिए ... क्योंकि मुझे स्टैक-ट्रेस की अनुपस्थिति से ट्राइप किया गया है। –

1

आप एक को Runnable सबमिट कर दी है:

public class MyThreadGroup extends ThreadGroup { 
    public MyThreadGroup() { 
     super("My Thread Group"); 
    } 
    public void uncaughtException(Thread t, Throwable ex) { 
     // Handle exception 
    } 
} 

Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... }; 
t.start(); 

एक AWT अपवाद संचालक का उपयोग करने का उदाहरण ExecutorService आप अपवाद को ExecutionException के अंदर लपेटकर पकड़ सकते हैं। (केवल कॉलिंग() पर कॉल करने की अत्यधिक अनुशंसा की जाती है)

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

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