Heim >Java >javaLernprogramm >Warum fängt „afterExecute' keine Ausnahmen von ausführbaren Aufgaben in Java „ExecutorService' ab?

Warum fängt „afterExecute' keine Ausnahmen von ausführbaren Aufgaben in Java „ExecutorService' ab?

Barbara Streisand
Barbara StreisandOriginal
2024-11-25 04:32:08443Durchsuche

Why Does `afterExecute` Not Catch Exceptions From Runnable Tasks in Java `ExecutorService`?

Ausnahmebehandlung für Java ExecutorService-Aufgaben

Bei der Verwendung von ExecutorService zum Ausführen umfangreicher Aufgaben ist es wichtig, mögliche Ausnahmen zu behandeln . Das Überschreiben der afterExecute-Methode von ThreadPoolExecutor ermöglicht die Ausnahmebehandlung nach der Ausführung. In bestimmten Szenarien verhält sich die Methode afterExecute jedoch möglicherweise nicht wie erwartet.

Betrachten Sie das folgende Codebeispiel:

public class ThreadPoolErrors extends ThreadPoolExecutor {
    public ThreadPoolErrors() {
        super(1, 1, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());
    }

    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!");
        }
    }

    public static void main(String[] args) {
        ThreadPoolErrors threadPool = new ThreadPoolErrors();
        threadPool.submit(
                new Runnable() {
                    public void run() {
                        throw new RuntimeException("Ouch! Got an error.");
                    }
                }
        );
        threadPool.shutdown();
    }
}

Überraschenderweise lautet die Ausgabe dieses Programms „Alles ist in Ordnung – Situation.“ normal!", obwohl die übermittelte Aufgabe absichtlich eine Ausnahme auslöst. Diese Diskrepanz tritt auf, weil die Submit-Methode die Run-Methode von Runnable verwendet, die keine Ausnahmen als Teil ihrer Signatur deklariert. Infolgedessen werden alle innerhalb der run-Methode ausgelösten Ausnahmen stillschweigend unterdrückt und nicht an die afterExecute-Methode weitergegeben.

Um dieses Problem zu beheben, sollten Sie die Verwendung von Callable anstelle von Runnable in Betracht ziehen. Callable ist eine Schnittstelle, die von der implementierenden Klasse verlangt, die Arten von Ausnahmen zu deklarieren, die von ihrer Aufrufmethode ausgelöst werden können. Dadurch kann die afterExecute-Methode des ThreadPoolExecutors alle Ausnahmen, die während der Aufgabenausführung auftreten, ordnungsgemäß behandeln und verarbeiten.

Durch die Verwendung von Callable und die entsprechende Behandlung von Ausnahmen können Sie sicherstellen, dass Ihre ExecutorService-Aufgaben zuverlässig ausgeführt werden und Fehler ordnungsgemäß behandeln.

Das obige ist der detaillierte Inhalt vonWarum fängt „afterExecute' keine Ausnahmen von ausführbaren Aufgaben in Java „ExecutorService' ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn