Maison > Java > javaDidacticiel > 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
Libérer: 2024-11-17 05:57:03
original
775 Les gens l'ont consulté

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

}
Copier après la connexion

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

}
Copier après la connexion

Dans l'ExampleService classe :

class ExampleService {

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

}
Copier après la connexion

Dans la classe d'auditeur :

class GetTaskNotificationWithoutBlocking {

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

}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal