Pelaksanaan Optimum untuk Menunggu Senarai Niaga Hadapan
Pengaturcaraan tak segerak menawarkan faedah seperti peningkatan responsif dan penggunaan sumber yang cekap. Walau bagaimanapun, mengurus pelbagai niaga hadapan secara serentak boleh memperkenalkan cabaran dalam menyelaraskan penyiapan dan pengendalian pengecualian dengan cekap. Artikel ini meneroka penyelesaian kepada masalah menunggu sehingga semua niaga hadapan dalam senarai selesai, atau pengecualian berlaku dalam mana-mana daripadanya.
Pendekatan terus terang melibatkan menyemak setiap masa hadapan secara individu menggunakan Future.get(). Walau bagaimanapun, kaedah ini menjadi tidak cekap untuk senarai besar, kerana ia memerlukan menunggu semua masa hadapan selesai walaupun ralat berlaku dalam tugasan yang lebih awal.
Penyelesaian alternatif terletak pada penggunaan CompletionService. Perkhidmatan ini menyediakan kaedah take() menyekat yang membolehkan pemanggil menerima niaga hadapan yang lengkap apabila ia tersedia. Pada masa yang sama, ia membenarkan pembatalan tugasan yang sedang dijalankan sekiranya berlaku ralat.
Pertimbangkan pelaksanaan berikut:
<code class="java">Executor executor = Executors.newFixedThreadPool(4); CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor); // Submit 4 tasks for (int i = 0; i < 4; i++) { completionService.submit(new Callable<SomeResult>() { public SomeResult call() { ... // Task logic return result; } }); } int received = 0; boolean errors = false; // Monitor future completion and errors while (received < 4 && !errors) { Future<SomeResult> resultFuture = completionService.take(); // Blocks if no futures available try { SomeResult result = resultFuture.get(); received++; ... // Process result } catch (Exception e) { // Log error errors = true; } }</code>
Dalam pelaksanaan ini, CompletionService menerima niaga hadapan yang lengkap melalui kaedah take()nya . Jika sebarang tugas memberikan pengecualian, bendera ralat ditetapkan kepada benar dan gelung ditamatkan. Pendekatan ini mengurangkan masa menunggu untuk tugasan seterusnya dengan ketara, menghasilkan pengendalian pengecualian yang lebih cekap.
Jika mahu, anda boleh meningkatkan penyelesaian ini dengan membatalkan sebarang tugas yang belum selesai apabila ralat berlaku, memastikan sumber dibebaskan dengan segera.
Atas ialah kandungan terperinci Bagaimana untuk Cekap Menunggu Pelbagai Niaga Hadapan dan Mengendalikan Pengecualian: PenyelesaianService lwn. Pemeriksaan Masa Depan Individu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!