Bei der Verwendung von Javas ThreadPoolExecutor zur gleichzeitigen Ausführung von Aufgaben mit einer eingeschränkten Thread-Pool-Größe ist es wichtig, potenzielle Ausnahmen zu verwalten, die während der Aufgabe auftreten können Ausführung. Die Verwendung der afterExecute-Methode für diesen Zweck funktioniert jedoch möglicherweise nicht wie erwartet.
Das Problem:
Im bereitgestellten Beispiel:
protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); if(t != null) { System.out.println("Got an error: " + t); } else { System.out.println("Everything's fine--situation normal!"); } }
Die Methode afterExecute wird nicht aufgerufen, wenn eine Aufgabe eine Ausnahme auslöst. Stattdessen wird in der Ausgabe fälschlicherweise „Alles ist in Ordnung“ angezeigt, obwohl eine Ausnahme aufgetreten ist. Dies liegt daran, dass aufgrund der Verwendung von „submit(Runnable r)“ anstelle von „submit(Callable c)“ keine Ausnahmen ausgelöst werden.
Callable vs. Runnable
Um effektiv zu sein Bei Verarbeitungsaufgabenausnahmen wird empfohlen, Callable anstelle von Runnable zu verwenden, wenn Aufgaben an ThreadPoolExecutor gesendet werden. Die call()-Methode von Callable kann geprüfte Ausnahmen auslösen, die dann über Future.get() an den aufrufenden Thread zurückgereicht werden.
Beispiel:
Callable<String> task = ... Future<String> future = executor.submit(task); // Do something else while task executes... try { String result = future.get(); } catch (ExecutionException ex) { Throwable cause = ex.getCause(); // Handle the exception as necessary }
If Die Callable.call()-Methode löst eine Ausnahme aus. Sie wird in eine ExecutionException eingeschlossen und von Future.get() ausgelöst. Dies ermöglicht eine ordnungsgemäße Behandlung der Ausnahme im aufrufenden Thread.
Hinweis: Es ist wichtig zu beachten, dass diese Lösung den aufrufenden Thread während des Future.get()-Aufrufs blockieren kann. Für erweiterte Fehlerbehandlungs- und Wiederherstellungsszenarien sollten Sie die Verwendung spezieller Fehlerbehandlungs-Frameworks oder benutzerdefinierter Implementierungen in Betracht ziehen.
Das obige ist der detaillierte Inhalt vonWie behandelt man Ausnahmen in Java ExecutorService-Aufgaben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!