Mengoptimumkan Senarai Masa Depan Menunggu dengan CompletionService
Apabila bekerja dengan senarai niaga hadapan, adalah penting untuk cekap menunggu penyelesaiannya atau mengendalikan pengecualian untuk mengelakkan kelewatan yang tidak perlu.
Andaikan anda mempunyai kaedah berikut yang mengembalikan senarai niaga hadapan:
List<Future<O>> futures = getFutures();
Untuk menunggu selesai atau menangkap pengecualian, pendekatan naif mungkin:
wait() { for(Future f : futures) { try { f.get(); } catch(Exception e) { //Specific exception handling //Exception in a future, stop waiting return; } } }
Walau bagaimanapun, pendekatan ini menunggu untuk setiap masa hadapan tanpa mengira pengecualian pada masa hadapan sebelumnya.
Penyelesaian adalah dengan menggunakan Perkhidmatan Penyiapan untuk menerima niaga hadapan apabila ia tersedia. Jika pengecualian berlaku, anda boleh membatalkan tugasan lain:
Executor executor = Executors.newFixedThreadPool(4); CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor); //Submit tasks for(int i = 0; i < 4; i++) { completionService.submit(() -> { ... return result; }); } int received = 0; boolean errors = false; while(received < 4 && !errors) { Future<SomeResult> resultFuture = completionService.take(); //Blocks if none available try { SomeResult result = resultFuture.get(); received++; ... //Process result } catch(Exception e) { //Log and set error flag errors = true; } }
Dalam pendekatan ini, tugasan diserahkan kepada pelaksana dan tugasan yang telah selesai diterima melalui perkhidmatan penyiapan. Jika pengecualian berlaku dalam tugasan yang diterima, gelung sementara ditamatkan dan anda boleh membatalkan sebarang tugasan yang tinggal menggunakan kaedah shutdownNow() pelaksana.
Atas ialah kandungan terperinci Bagaimanakah CompletionService boleh digunakan untuk mengoptimumkan menunggu senarai niaga hadapan dan mengendalikan pengecualian dengan cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!