2013-08-14 6 views
5

मेरे पास एक मुख्य धागा है जिसने कई श्रमिकों को बनाया है, प्रत्येक कार्यकर्ता एक धागा है।जावा मल्टीथ्रेडिंग त्रुटियों को संभालने

कुछ कार्यकर्ता या कार्यकर्ता में अपवाद सफलतापूर्वक समाप्त नहीं हो सकता है, तो मैं मुख्य थ्रेड में श्रमिकों से त्रुटियों को कैसे प्राप्त कर सकता हूं?

कार्यकर्ता धागे से पहले त्रुटि कैसे भेजें?

+3

आप ([ 'Callable'] पर एक नज़र http://docs.oracle.com/javase/7/docs/api/java लेना चाहिए /util/concurrent/Callable.html) और ['भविष्य'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html)। आप ['UncaughtExceptionHandler'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html) का भी उपयोग कर सकते हैं, हालांकि, मैं थोड़ा गंदा मानता हूं। .. आप अपना खुद का कॉलबैक तंत्र भी स्थापित कर सकते हैं – MadProgrammer

+0

http://stackoverflow.com/questions/2248131/handling-exceptions-from-java-executorservice-tasks?rq=1 – Olga

+0

पर एक नज़र डालें क्या आप भविष्य के इंटरबैक इंटरफ़ेस के बारे में जानते हैं? http://stackoverflow.com/questions/18227173/java-multithreaded-programming-using-with-guava-futurecallback-interface? – prilia

उत्तर

3

आप java.util.concurrent निर्वाहक चौखटे का उपयोग करें और एक उत्पन्न करते हैं प्रत्येक सबमिट किए गए कार्यकर्ता से भविष्य, फिर भविष्य में कॉल() को कॉल करना आपको या तो कार्यकर्ता का परिणाम देगा, या उस कार्यकर्ता के भीतर फेंक दिया गया अपवाद।

0

इसे प्राप्त करने का एक तरीका थ्रेड में गुजरने वाला सिग्नल का उपयोग कर रहा है। सिग्नल पासिंग का व्यापक रूप से उपयोग किया जाता है, जब आपको एक-दूसरे के बीच संवाद करने के लिए धागे की आवश्यकता होती है। इसे प्राप्त करने का सरल तरीका धागे के बीच साझा वस्तुओं तक पहुंचने और ऑब्जेक्ट के मूल्य (सिग्नल के संकेत) की निगरानी करना हो सकता है। आप विफलता (सिग्नल के रूप में) को इंगित करने वाले ऑब्जेक्ट को कुछ मान निर्दिष्ट कर सकते हैं ताकि अन्य थ्रेड उपयुक्त कार्यवाही कर सकें।
संकेतों का उपयोग करके, आप केवल विफलता सिग्नल पास नहीं कर सकते हैं, लेकिन कई अन्य स्थिति सिग्नल साथ ही किसी साझा ऑब्जेक्ट को उपयुक्त मान सेट करके (थ्रेड की स्थिति को इंगित करने वाले विभिन्न मानों के साथ एनम कहें)।
अधिक जानकारी के लिए इस लिंक का संदर्भ लें: http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

2

आप वैश्विक UncaughtExceptionHandler सेट कर सकते हैं जो सभी धागे में सभी ध्यान में न आया अपवाद रोकना होगा

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     ... 
    } 
}); 
0

उपयोग ExecutorService या ThreadPoolExecutor

आप try{}catch{}Exceptoion{} ब्लॉक

  • अवहेलना ThreadPoolExecutor
  • की afterExecute विधि में तीन तरीके

    में अपवाद पकड़ कर सकते हैं
    1. Future .Get()
    2. लपेटें पूरे run() or call() विधि

    अधिक जानकारी के लिए एसई सवाल नीचे देखें:

    Handling Exceptions for ThreadPoolExecutor

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