logo

Qu’est-ce que CompleteableFuture ?

UN CompltableFuture est utilisé pour la programmation asynchrone. La programmation asynchrone consiste à écrire du code non bloquant. Il exécute une tâche sur un thread distinct du thread d'application principal et informe le thread principal de sa progression, de son achèvement ou de son échec.

De cette façon, le thread principal ne bloque pas et n’attend pas la fin de la tâche. D'autres tâches s'exécutent en parallèle. Le parallélisme améliore les performances du programme.

Un CompletableFuture est une classe en Java. Il appartient au package java.util.cocurrent. Il implémente les interfaces CompletionStage et Future.

Étape d'achèvement

  • Il effectue une action et renvoie une valeur lorsqu'une autre étape d'achèvement est terminée.
  • Un modèle pour une tâche qui peut déclencher d'autres tâches.

C’est donc un élément d’une chaîne.

Lorsque plusieurs threads tentent de se terminer – terminer exceptionnellement ou annuler un CompletableFuture, un seul d’entre eux réussit.

planification du tournoi à la ronde

Futur vs CompletableFuture

Un CompletableFuture est une extension de l'API Future de Java qui a été introduite dans Java 8.

Un Future est utilisé pour la programmation asynchrone. Il fournit deux méthodes, isDone() et get(). Les méthodes récupèrent le résultat du calcul une fois celui-ci terminé.

Limites du futur

  • Un avenir ne peut pas être mutuellement complet.
  • Nous ne pouvons pas effectuer d'autres actions sur le résultat d'un Future sans bloquer.
  • Future n'a aucune gestion des exceptions.
  • Nous ne pouvons pas combiner plusieurs futurs.

Future a tellement de limites, c'est pourquoi nous avons CompleteableFuture. CompleteableFuture fournit un large ensemble de méthodes pour créer plusieurs Futures, les enchaîner et les combiner. Il dispose également d’un support complet de gestion des exceptions.

Créer un avenir complet

Nous pouvons créer un CompletableFuture uniquement en utilisant le constructeur sans argument suivant.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Exemple

Les méthodes CompleteableFuture les plus fréquemment utilisées sont :

sqrt java mathématiques
    supplyAsync() :Il termine son travail de manière asynchrone. Le résultat de supplier est exécuté par une tâche de ForkJoinPool.commonPool() par défaut. La méthode supplyAsync() renvoie CompletableFuture sur laquelle on peut appliquer d'autres méthodes.thenAppliquer() :La méthode accepte la fonction comme arguments. Il renvoie un nouveau CompletableStage lorsque cette étape se termine normalement. La nouvelle étape est utilisée comme argument de la fonction fournie.rejoindre():la méthode renvoie la valeur du résultat une fois terminée. Il lève également une CompletionException (exception non vérifiée) si elle est terminée exceptionnellement.
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

Sortir:

CompleteableFuture en Java

Gestion des exceptions de CompletableFuture

Considérons la figure suivante, qui représente les cinq CF :

CompleteableFuture en Java

Supposons que cinq CF soient en exécution et que CF21 lève une exception, alors toutes les CF dépendantes (CF31 et CF41) sont en erreur. Cela signifie que:

  • L’appel à la méthode isCompletedExceptionally() renvoie true.
  • L'appel à get() lève une ExecutionException qui provoque l'exception racine.

Considérez la figure suivante, dans laquelle nous avons créé CF30 avec une exception.

CompleteableFuture en Java

Lorsque CF21 s'exécute normalement, CF30 transmet simplement la valeur. S'il déclenche une exception, CF30 la gère et génère une valeur pour CF31.

Il existe trois méthodes pour gérer une exception :

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);