Maison  >  Article  >  Java  >  Comment obtenir des notifications d'achèvement de tâches sans blocage dans les exécuteurs Java ?

Comment obtenir des notifications d'achèvement de tâches sans blocage dans les exécuteurs Java ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-17 05:57:03698parcourir

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

Exécuteurs Java : notifier sans bloquer l'achèvement d'une tâche

Énoncé du problème

Une file d'attente de tâches doit être traitée de manière séquentielle. Alors que l'approche la plus simple consiste à bloquer l'achèvement de chaque tâche à l'aide de .get() sur le Future, cette approche peut entraîner des problèmes de mémoire lors de la gestion de nombreuses files d'attente. L'objectif est de mettre en œuvre un mécanisme non bloquant qui avertit l'appelant lorsqu'une tâche est terminée, permettant ainsi aux tâches d'être traitées séquentiellement sans blocage.

Solution

Pour éviter le blocage, la solution consiste à définir une interface de rappel qui reçoit les paramètres à la fin de la tâche. Ce rappel est ensuite invoqué à la fin de chaque tâche.

Tâche de rappel personnalisée

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 a introduit CompletableFuture, qui fournit un mécanisme plus complet pour créer pipelines asynchrones et conditionnels.

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

}

Dans l'ExampleService classe :

class ExampleService {

  String work() {
    // Code to perform long-running task
    return "Result from long-running task";
  }

}

Dans la classe d'auditeur :

class GetTaskNotificationWithoutBlocking {

  void notify(String msg) {
    // Code to handle the message from the completed task
  }

}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn