Rumah > Java > javaTutorial > teks badan

Bagaimana untuk Cekap Menunggu Pelbagai Niaga Hadapan dan Mengendalikan Pengecualian: PenyelesaianService lwn. Pemeriksaan Masa Depan Individu?

Patricia Arquette
Lepaskan: 2024-10-25 22:57:28
asal
497 orang telah melayarinya

How to Efficiently Wait for Multiple Futures and Handle Exceptions: CompletionService vs. Individual Future Checks?

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>
Salin selepas log masuk

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!

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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!