Rumah >Java >javaTutorial >Mengapakah `afterExecute` Tidak Menangkap Pengecualian Daripada Tugasan Boleh Dijalankan dalam Java `ExecutorService`?

Mengapakah `afterExecute` Tidak Menangkap Pengecualian Daripada Tugasan Boleh Dijalankan dalam Java `ExecutorService`?

Barbara Streisand
Barbara Streisandasal
2024-11-25 04:32:08443semak imbas

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

Pengendalian Pengecualian untuk Tugas Java ExecutorService

Apabila menggunakan ExecutorService untuk melaksanakan tugas berat, adalah penting untuk mengendalikan kemungkinan pengecualian yang mungkin timbul . Mengatasi kaedah afterExecute ThreadPoolExecutor membenarkan pengendalian pengecualian selepas pelaksanaan. Walau bagaimanapun, dalam senario tertentu, kaedah afterExecute mungkin tidak berfungsi seperti yang diharapkan.

Pertimbangkan contoh kod berikut:

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();
    }
}

Anehnya, output program ini ialah "Semuanya baik--situasi biasa!", walaupun tugasan yang diserahkan sengaja membuang pengecualian. Percanggahan ini berlaku kerana kaedah penyerahan menggunakan kaedah jalankan Runnable, yang tidak mengisytiharkan sebarang pengecualian sebagai sebahagian daripada tandatangannya. Akibatnya, sebarang pengecualian yang dilemparkan dalam kaedah larian ditindas secara senyap dan tidak disebarkan kepada kaedah afterExecute.

Untuk menyelesaikan isu ini, pertimbangkan untuk menggunakan Callable dan bukannya Runnable. Boleh dipanggil ialah antara muka yang memerlukan kelas pelaksana untuk mengisytiharkan jenis pengecualian yang mungkin dilemparkan oleh kaedah panggilannya. Ini membolehkan kaedah afterExecute ThreadPoolExecutor mengendalikan dan memproses sebarang pengecualian yang berlaku semasa pelaksanaan tugas dengan betul.

Dengan menggunakan Pengecualian Boleh Panggil dan mengendalikan dengan sewajarnya, anda boleh memastikan bahawa tugasan ExecutorService anda dilaksanakan dengan pasti dan mengendalikan ralat dengan baik.

Atas ialah kandungan terperinci Mengapakah `afterExecute` Tidak Menangkap Pengecualian Daripada Tugasan Boleh Dijalankan dalam Java `ExecutorService`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn