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
Lepaskan: 2024-11-25 04:32:08
asal
451 orang telah melayarinya

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();
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan