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.
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.
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 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!