2013-08-14 5 views
5

Mam jeden główny wątek, który utworzył wielu pracowników, każdy pracownik jest wątkiem.Obsługa błędów wielowątkowości w języku Java

Jak mogę uzyskać błędy od robotników w głównym wątku, jeśli wystąpił wyjątek w niektórych robotach lub pracownik nie może zakończyć się pomyślnie?

Jak wysłać błąd przed martwą wątku roboczego?

+3

Należy przyjrzeć [ 'Callable'] (http://docs.oracle.com/javase/7/docs/api/java /util/concurrent/Callable.html) i ['Future'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html). Możesz także użyć ['UncaughtExceptionHandler'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html), chociaż uważam to za trochę brudne. .. Możesz również ustanowić swój własny mechanizm zwrotny. – MadProgrammer

+0

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

+0

Czy wiesz o interfejsie futurecallback? http://stackoverflow.com/questions/18227173/java-multithreaded-programming-using-w-guava-futurecallback-interface? – prilia

Odpowiedz

3

Jeśli używasz java.util.concurrent ram Egzekutor i generują Przyszłość od każdego przesłanego pracownika, a następnie wywołanie metody get() w przyszłości przyniesie wynik pracownika lub wyjątek wyrzucony/przechwycony przez tego pracownika.

0

Jednym ze sposobów osiągnięcia tego jest użycie sygnału w wątkach. Przekazywanie sygnału jest szeroko stosowane, gdy potrzebujesz wątków do komunikowania się między sobą. Prostym sposobem osiągnięcia tego może być dostęp do współdzielonych obiektów między wątkami i monitorowanie wartości obiektu (wskazanie sygnału). Możesz przypisać pewną wartość do obiektu, wskazując awarię (w postaci sygnału), aby inne wątki mogły podjąć odpowiednie działania.
Korzystając z sygnałów, można nie tylko przekazywać sygnały o błędach, ale także różne inne sygnały statusu, a także ustawiając odpowiednią wartość dla obiektu udostępnionego (np. Wylicz z różnymi wartościami wskazującymi stan wątku).
patrz link po więcej szczegółów: http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

2

Można ustawić globalny UncaughtExceptionHandler który przechwyci wszystkie niezłapane Wyjątki we wszystkich wątkach

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