Menunggu Tugasan Perkhidmatan Pelaksana Selesai
Soalan:
Bagaimana seseorang boleh menunggu dengan cekap semua tugasan yang diserahkan kepada ExecutorService untuk diselesaikan? Kes penggunaan khusus melibatkan tugas pengiraan yang dilaksanakan pada berbilang teras.
Latar Belakang:
Coretan kod yang diberikan menggunakan ExecutorService.wait(), tetapi ia gagal dengan IllegalMonitorStateException. Walaupun pelaksanaan tugas berjaya, operasi tunggu nampaknya menghadapi masalah.
Jawapan:
ExecutorService.invokeAll()
Penyelesaian yang disyorkan ialah menggunakan ExecutorService.invokeAll(). Ia menyediakan kaedah mudah untuk menunggu semua tugasan selesai. Berikut ialah contoh kod yang diubah suai:
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> todo = new ArrayList<>(singleTable.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() Behavior
invokeAll() akan menyekat sehingga semua tugasan selesai. Koleksi jawapan yang terhasil mengandungi Niaga Hadapan yang mewakili setiap status tugas dan potensi nilai pulangan. Secara lalai, dibalut oleh Executors.callable(), Niaga Hadapan ini akan mengembalikan nol. Walau bagaimanapun, anda boleh mengubah suai ComputeDTask untuk melaksanakan Callable
Faedah:
Menggunakan invokeAll() memudahkan kod dan mengelakkan kemungkinan keadaan perlumbaan yang dikaitkan dengan wait(). Ia juga membenarkan kebolehgunaan semula ExecutorService untuk berbilang kitaran.
Soalan Berkaitan:
Untuk penjelasan lanjut, pertimbangkan soalan berkaitan berikut tentang Stack Overflow:
Atas ialah kandungan terperinci Bagaimana dengan Cekap Menunggu Semua Tugasan Perkhidmatan Pelaksana Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!