2013-08-14 13 views
5

Ho un thread principale che ha creato molti worker, ogni worker è un thread.Gestione errori di multithreading Java

Come posso ottenere errori dagli operatori nel thread principale se c'era un'eccezione in qualche lavoratore o lavoratore non riuscita correttamente?

Come inviare un errore prima che il thread di lavoro sia morto?

+3

si dovrebbe dare un'occhiata a [ 'Callable'] (http://docs.oracle.com/javase/7/docs/api/java /util/concurrent/Callable.html) e ['Future'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html). Si potrebbe anche usare ['UncaughtExceptionHandler'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.html), anche se lo considererei un po 'sporco. ..Potrebbe anche stabilire il proprio meccanismo di callback – MadProgrammer

+0

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

+0

Conosci l'interfaccia di futurecallback? http://stackoverflow.com/questions/18227173/java-multithreaded-programming-using-with-guava-futurecallback-interface? – prilia

risposta

3

Se si utilizzano i quadri Executor java.util.concurrent e generare un Futuro da ciascun lavoratore inviato, quindi chiamare get() sul Futuro ti darà il risultato del lavoratore, o l'eccezione generata/catturata all'interno di quel lavoratore.

0

Un modo per ottenere ciò è utilizzare il segnale che passa nei thread. Il passaggio del segnale viene ampiamente utilizzato, quando è necessario che i thread comunichino tra loro. Un modo semplice per ottenere ciò potrebbe essere quello di accedere agli oggetti condivisi tra i thread e monitorare il valore dell'oggetto (indicazione di un segnale). È possibile assegnare un valore all'oggetto che indica l'errore (in forma di segnale) in modo che altri thread possano eseguire le azioni appropriate.
Utilizzando i segnali, è possibile non solo trasmettere segnali di errore ma diversi altri segnali di stato impostando il valore appropriato su un oggetto condiviso (ad esempio, Enum con valori diversi che indicano lo stato del thread).
consultare questo link per maggiori informazioni: http://tutorials.jenkov.com/java-concurrency/thread-signaling.html

2

È possibile impostare globale UncaughtExceptionHandler che intercettare tutte le eccezioni non gestite fanno in tutte le discussioni

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