Barisan tugasan mesti diproses secara berurutan. Walaupun pendekatan paling mudah melibatkan penyekatan pada setiap penyiapan tugas menggunakan .get() pada Masa Depan, pendekatan ini boleh membawa kepada isu ingatan apabila menguruskan banyak baris gilir. Matlamatnya adalah untuk melaksanakan mekanisme bukan sekatan yang memberitahu pemanggil apabila tugasan selesai, membolehkan tugasan diproses secara berurutan tanpa menyekat.
Untuk mengelakkan sekatan, penyelesaian melibatkan penentuan antara muka panggil balik yang menerima parameter semasa tugas selesai. Panggilan balik ini kemudiannya dipanggil pada penghujung setiap tugas.
class CallbackTask implements Runnable { private final Runnable task; private final Callback callback; CallbackTask(Runnable task, Callback callback) { this.task = task; this.callback = callback; } public void run() { task.run(); callback.complete(); } }
Java 8 memperkenalkan CompletableFuture, yang menyediakan mekanisme yang lebih komprehensif untuk mencipta talian paip tak segerak dan bersyarat.
import java.util.concurrent.CompletableFuture; public class GetTaskNotificationWithoutBlocking { public static void main(String... argv) throws Exception { ExampleService svc = new ExampleService(); GetTaskNotificationWithoutBlocking listener = new GetTaskNotificationWithoutBlocking(); CompletableFuture<String> f = CompletableFuture.supplyAsync(svc::work); f.thenAccept(listener::notify); } }
Dalam Contoh Kelas Perkhidmatan:
class ExampleService { String work() { // Code to perform long-running task return "Result from long-running task"; } }
Dalam kelas pendengar:
class GetTaskNotificationWithoutBlocking { void notify(String msg) { // Code to handle the message from the completed task } }
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Pemberitahuan Penyelesaian Tugas Tanpa Menyekat dalam Java Executors?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!