2013-08-14 14 views
5

Ich habe einen Hauptfaden es hat viele Arbeiter erstellt, jeder Arbeiter ist ein Thread.Java Multithreading-Fehler Handhabung

Wie kann ich Fehler von den Arbeitern im Hauptthread erhalten, wenn eine Ausnahme in einem Arbeiter oder Arbeiter nicht erfolgreich beendet wurde?

Wie Fehler vor dem Arbeiter Thread tot gesendet werden?

+3

Sie sollten einen Blick auf [ 'Callable'] (http://docs.oracle.com/javase/7/docs/api/java /util/concurrent/Callable.html) und ['Future'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html). Du könntest auch ['UncaughtExceptionHandler'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html) benutzen, obwohl ich das ein bisschen dreckig finde. ..Sie könnten auch Ihren eigenen Rückrufmechanismus einrichten – MadProgrammer

+0

Werfen Sie einen Blick auf http://StackOverflow.com/Questions/2248131/Handling-Exceptions-from-Java-Executorservice-Tasks?RQ=1 – Olga

+0

Kennen Sie über FutureCallback-Schnittstelle? http://stackoverflow.com/questions/18227173/java-multithreaded-programming-using-with-guava-futurecallback-interface? – prilia

Antwort

3

Wenn Sie die java.util.concurrent Executor-Frameworks verwenden und erzeugen ein Zukunft von jedem übermittelten Arbeiter, dann ruft get() auf der Zukunft entweder das Ergebnis des Arbeiters oder die Ausnahme auf, die innerhalb dieses Arbeiters geworfen/gefangen wird.

0

Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Signalübertragung in Threads. Die Signalweiterleitung wird häufig verwendet, wenn Sie Threads benötigen, um miteinander zu kommunizieren. Ein einfacher Weg dies zu erreichen könnte sein, auf geteilte Objekte zwischen Threads zuzugreifen und den Wert des Objekts zu überwachen (Anzeige eines Signals). Sie können dem Objekt einen Wert zuweisen, der den Fehler anzeigt (in Form eines Signals), damit andere Threads entsprechende Maßnahmen ergreifen können.
Mit Hilfe von Signalen können Sie nicht nur Fehlersignale sondern auch andere verschiedene Statussignale übergeben, indem Sie den entsprechenden Wert auf ein gemeinsames Objekt setzen (z. B. Enum mit verschiedenen Werten, die den Zustand des Threads anzeigen).
Siehe diesen Link für weitere Informationen: http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

2

Sie global UncaughtExceptionHandler festlegen können, welche alle nicht abgefangene Ausnahmen in allen Threads abfängt

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