Heim >Java >javaLernprogramm >Wie erhalte ich Benachrichtigungen über den Abschluss von Aufgaben, ohne sie in Java-Executoren zu blockieren?

Wie erhalte ich Benachrichtigungen über den Abschluss von Aufgaben, ohne sie in Java-Executoren zu blockieren?

Linda Hamilton
Linda HamiltonOriginal
2024-11-17 05:57:03769Durchsuche

How to Get Task Completion Notifications Without Blocking in Java Executors?

Java-Ausführer: Benachrichtigung ohne Blockierung bei Aufgabenabschluss

Problemstellung

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.

Lösung

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.

Benutzerdefinierte Rückrufaufgabe

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();
  }

}

CompletableFuture

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn