2012-12-10 12 views
5

Sto alimentando le discussioni in un ExecutorService.Come notare un'eccezione dal thread principale?

Questi thread stanno manipolando alcuni dati, e se c'è un conflitto, l'oggetto dati genera un'eccezione, che viene catturata dal thread in conflitto, che a sua volta interrompe e non completa l'esecuzione.

In questo caso, il thread di interruzione deve essere reinserito nella coda e reinserito nell'esecutore.

Come posso sapere se è stata generata un'eccezione dal thread principale?

risposta

11

Quando si esegue l'operazione ExecutorService, come risultato, si ottiene un futuro. Quando l'esecuzione è finita, puoi chiamare get() in quel futuro. Ciò restituirà il risultato, se applicabile, o genererà un ExecutionException se l'attività originale ne ha gettato uno. Se vuoi il vero oggetto di eccezione puoi fare getCause().

Si noti inoltre che si sarebbe messa una Task di nuovo in servizio, questo compito è stato eseguito su un Thread che non ha davvero terminato (appena catturato l'eccezione ed è in attesa di una nuova).

Ecco un esempio di utilizzo (è possibile utilizzare Runnable se non si cura per il risultato).

Callable<String> myCallable = ...; 
Future<String> future = myExector.submit(myCallable); 

// Do something else until myCallable.isDone() returns true. 
try { 
    String result = future.get(); 
}catch(ExecutionException e){ 
    // Handle error, perhaps create new Callable to submit. 
} 
+1

Sono molto nuovo con Java. Potresti disegnare un esempio barebone usando quelle chiamate? – Aerovistae

+0

Aggiunto un esempio – Thirler

Problemi correlati