2016-03-23 4 views
0

Wenn ich eine Zukunft ausführen und eine Ausnahme auslösen, habe ich diese Ausnahme beim Aufruf Future.get als ExecutionException.Wo wird eine Exception ausgelöst, während das Ergebnis einer Zukunft mit einem Timeout gesetzt wird?

Aber wo geht die ausgelöste Ausnahme, wenn ich rufe Future.get(timeout) und die Ausnahme ausgelöst wird, nachdem das Timeout abgelaufen ist, wie:

Future<String> future = Executors.newSingleThreadExecutor().submit(() -> { 
     Thread.sleep(200); 
     System.out.println("COMPLETED"); 
     throw new Exception("ERROR"); 
    }); 
    try { 
     future.get(100, TimeUnit.MILLISECONDS); 
    } catch (InterruptedException | ExecutionException | TimeoutException e) { 
     e.printStackTrace(); 
    } 
    Thread.sleep(1_000); 

Irgendwelche Ideen? TIA!

+2

Nun, es wird geworfen und gefangen auf dem Thread Ihres Executors. –

+0

@ValentinWaeselynck So, um z.B. log es, ich muss meinen eigenen Executor implementieren? – t777

+0

Nein, Sie brauchen nur einen 'try {} catch() {}' Block in Ihrem Lambda. – AJNeufeld

Antwort

1

Es gibt nichts anderes in Bezug auf Ausnahmen in den zwei Fällen, die Sie beschreiben. Stellen Sie sich zum Beispiel vor, dass die asynchrone Aufgabe, die durch Ihre Future dargestellt wird, möglicherweise beendet wird, indem eine Ausnahme ausgelöst wird, bevor Sie die get()-Methode aufrufen. Der Executor muss die Ausnahme abfangen und für Sie halten, bis Sie eine der Methoden get() aufrufen.

Wenn Sie anrufen und das Zeitlimit abgelaufen ist, bedeutet dies nicht, dass Sie das Ergebnis nie erhalten werden; Es bedeutet nur, dass Sie es nicht über diesen bestimmten Methodenaufruf erhalten. Normalerweise würdest du dann entweder cancel() die Aufgabe versuchen oder später nochmal versuchen, das Ergebnis zu bekommen.

+0

In der Tat, wenn * I * ein "Executor" wäre, würde ich solche Ausnahmen halten, indem ich sie in die entsprechenden 'Future'-Instanzen stopfte. Dann könnte ich einfach alle Verweise auf diese 'Zukunft' fallen lassen und sie vergessen. –

Verwandte Themen