Eine Aufgabenwarteschlange muss nacheinander verarbeitet werden. Während der einfachste Ansatz darin besteht, den Abschluss jeder Aufgabe mithilfe von .get() für die Zukunft zu blockieren, kann dieser Ansatz bei der Verwaltung zahlreicher Warteschlangen zu Speicherproblemen führen. Das Ziel besteht darin, einen nicht blockierenden Mechanismus zu implementieren, der den Aufrufer benachrichtigt, wenn eine Aufgabe abgeschlossen ist, sodass Aufgaben nacheinander ohne Blockierung verarbeitet werden können.
Um Blockierungen zu vermeiden, umfasst die Lösung die Definition eine Rückrufschnittstelle, die Parameter bei Abschluss der Aufgabe empfängt. Dieser Rückruf wird dann am Ende jeder Aufgabe aufgerufen.
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 führte CompletableFuture ein, das einen umfassenderen Mechanismus zum Erstellen bietet asynchrone und bedingte Pipelines.
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); } }
Im Beispieldienst Klasse:
class ExampleService { String work() { // Code to perform long-running task return "Result from long-running task"; } }
In der Listener-Klasse:
class GetTaskNotificationWithoutBlocking { void notify(String msg) { // Code to handle the message from the completed task } }
Das obige ist der detaillierte Inhalt vonWie erhalte ich Benachrichtigungen über den Abschluss von Aufgaben, ohne sie in Java-Executoren zu blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!