ExecutorService - Penyelesaian Menunggu Penyiapan Tugasan
Apabila bekerja dengan sejumlah besar tugas pengiraan yang perlu dilaksanakan serentak, ia adalah penting untuk mempunyai mekanisme untuk menunggu semua tugas selesai. Ini memastikan bahawa tindakan seterusnya boleh dilakukan hanya selepas semua tugasan selesai.
Dalam contoh anda, di mana anda cuba menggunakan ExecutorService.wait() untuk mencapainya, anda menghadapi IllegalMonitorStateException. Ralat ini berlaku kerana wait() dimaksudkan untuk digunakan semasa menunggu pada kunci intrinsik objek, yang tidak berkenaan dalam senario ini.
Penyelesaian paling mudah ialah memanfaatkan ExecutorService.invokeAll(). Kaedah ini mengambil koleksi tugas Boleh Panggil, melaksanakannya secara selari dan mengembalikan senarai objek Masa Depan. Setiap Masa Depan mewakili hasil tugas tertentu. Secara lalai, invokeAll() akan menyekat sehingga semua tugasan selesai sebelum mengembalikan senarai objek Masa Depan.
Begini cara anda boleh mengubah suai kod anda:
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> tasks = new ArrayList<>(); for (DataTable singleTable : uniquePhrases) { tasks.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> results = es.invokeAll(tasks);
Dalam kod yang dikemas kini ini, ExecutorService .invokeAll() akan menunggu sehingga semua tugasan selesai, membolehkan anda meneruskan tindakan anda yang seterusnya dengan yakin.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memastikan Semua Tugas Selesai Sebelum Meneruskan Perkhidmatan Pelaksana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!