Rumah >Java >javaTutorial >Bagaimana dengan Cekap Menunggu Semua Tugasan Perkhidmatan Pelaksana Selesai?

Bagaimana dengan Cekap Menunggu Semua Tugasan Perkhidmatan Pelaksana Selesai?

Barbara Streisand
Barbara Streisandasal
2024-12-03 12:28:10191semak imbas

How to Efficiently Wait for All ExecutorService Tasks to Finish?

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 untuk memberikan nilai pulangan yang bermakna.

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:

  • [Bagaimana untuk menunggu semua benang untuk selesai](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [Kembalikan nilai daripada java threads](https://stackoverflow.com/questions/11937661/return-values-from-java-threads)
  • [invokeAll() tidak bersedia menerima Koleksi>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)
  • [Adakah saya perlu segerakkan?](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

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!

Kenyataan:
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