में अपवाद को पकड़ने के लिए है कि FutureTask
जावा 1.6 (और ग्रहण से) पर एक Executors.newCachedThreadPool()
में चल खोजने के बाद Runnable.run()
विधि में अपवाद निगल, मैं फेंक/कैच जोड़े बिना इन को पकड़ने के लिए एक तरह से साथ आने के लिए कोशिश की है मेरे सभी Runnable
कार्यान्वयन के लिए।कैसे FutureTask
एपीआई पता चलता है कि अधिभावी FutureTask.setException()
इस में मदद करनी चाहिए:, इसके कारण के रूप में दिया फेंकने योग्य के साथ एक ExecutionException रिपोर्ट करने के लिए जब तक कि इस भविष्य को पहले से ही स्थापित किया गया है या रद्द कर दिया गया
कारण यह भविष्य। इस पद्धति को गणना की विफलता पर रन विधि द्वारा आंतरिक रूप से बुलाया जाता है।
हालांकि इस विधि के नाम से जाना प्रतीत नहीं होता है (डिबगर के साथ चल रहा से पता चलता अपवाद FutureTask
द्वारा पकड़ा जाता है, लेकिन setException
कहा जाता है नहीं है)। मैं मेरी समस्या पुन: पेश करने के बाद कार्यक्रम में लिखा है:
public class RunTest {
public static void main(String[] args) {
MyFutureTask t = new MyFutureTask(new Runnable() {
@Override
public void run() {
throw new RuntimeException("Unchecked exception");
}
});
ExecutorService service = Executors.newCachedThreadPool();
service.submit(t);
}
}
public class MyFutureTask extends FutureTask<Object> {
public MyFutureTask(Runnable r) {
super(r, null);
}
@Override
protected void setException(Throwable t) {
super.setException(t);
System.out.println("Exception: " + t);
}
}
मेरा मुख्य सवाल यह है: मैं एक FutureTask में फेंक दिया अपवाद कैसे पकड़ कर सकते हैं? setException
क्यों नहीं कहा जाता है?
मैं यह भी जानना चाहता हूं कि Thread.UncaughtExceptionHandler
तंत्र का उपयोग FutureTask
द्वारा क्यों नहीं किया जाता है, क्या इसके लिए कोई कारण है?
'setException' का अच्छी तरह से उपयोग किया जाता है। मैंने आपके कोड को कॉपी किया है और यह काम करता है। कार्य पर 'get()' विधि को कॉल करते समय आप 'निष्पादन अपवाद' की कोशिश करने का प्रयास भी कर सकते हैं। – Kru
कॉल करने योग्य/भविष्य कॉम्बो का उपयोग करने का गलत तरीका। Future.get() विधि आपको निष्पादन अपवाद में लपेटा गया अपवाद प्रदान करता है। – Bhushan