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!