In einem Szenario, in dem mehrere Warteschlangen Aufgaben enthalten, die nacheinander von einem Executor-Dienst ausgeführt werden sollen, können blockierende Vorgänge übermäßig viel Stapelspeicher verbrauchen. Um dieses Problem zu entschärfen, ist ein nicht blockierender Ansatz wünschenswert.
Eine Lösung besteht darin, eine Rückrufschnittstelle mit Methoden zum Verarbeiten von Ergebnissen und zum Übergeben notwendiger Parameter zu definieren. Diese Schnittstelle kann in einer Wrapper-Klasse für ausführbare Aufgaben implementiert werden, die dann an den Executor-Dienst übermittelt werden. Nach Abschluss der Aufgabe wird die Rückrufschnittstelle aufgerufen.
interface Callback { void complete(); } 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(); } }
Alternativ führt Java 8 CompletableFuture ein, das Mechanismen für die asynchrone Aufgabenerstellung und bedingte Verarbeitung bereitstellt. Hier ist ein Beispiel mit CompletableFuture:
CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> ExampleService.work()); f.thenAccept(listener::notify);
In diesem Beispiel ist exampleService.work() die Aufgabe, die asynchron ausgeführt werden soll. Die Benachrichtigungsmethode ist der Rückruf, der aufgerufen wird, wenn die Aufgabe abgeschlossen ist.
Mit diesen Techniken können Aufgaben ohne Blockierung an einen Executor-Dienst übermittelt werden, was eine effiziente Verarbeitung großer Warteschlangen ermöglicht und gleichzeitig eine Erschöpfung des Stapelspeicherplatzes vermeidet.
Das obige ist der detaillierte Inhalt vonWie können Java-Ausführer asynchrone Benachrichtigungen über den Abschluss von Aufgaben verarbeiten, ohne sie zu blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!