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
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:
Gestion des exceptions de CompletableFuture
Considérons la figure suivante, qui représente les cinq CF :
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.
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);