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

Bagaimana dengan Cekap Menunggu Semua Tugasan Perkhidmatan Pelaksana Selesai?

Barbara Streisand
Lepaskan: 2024-12-03 12:28:10
asal
187 orang telah melayarinya

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

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!

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