0Pricing
Java Academy · Leçon

Combiner des futures : allOf et anyOf

Attendez tous les futures avec allOf et mettez-les en concurrence avec anyOf pour implémenter une logique de délai d’attente et de solution de repli.

Combiner des futures : allOf et anyOf est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Pourquoi combiner des opérations asynchrones ?

Lorsque des tâches asynchrones indépendantes peuvent s'exécuter en parallèle, vous devez attendre que toutes les tâches soient terminées, ou que la première le soit, avant de continuer. allOf et anyOf prennent en charge ces deux cas.

allOf : attendre toutes les opérations asynchrones

CompletableFuture.allOf(futures...) renvoie un CompletableFuture<Void> qui se termine lorsque TOUTES les opérations asynchrones d'entrée sont terminées. Si l'une d'elles échoue, allOf échoue également.

CompletableFuture<String> f1 = fetchUserAsync();
CompletableFuture<List<Order>> f2 = fetchOrdersAsync();
CompletableFuture<Double> f3 = fetchBalanceAsync();
CompletableFuture<Void> all = CompletableFuture.allOf(f1, f2, f3);
all.join(); // wait for all three
String user   = f1.join();
List<Order> orders = f2.join();
Double balance = f3.join();

Récupérer les résultats de allOf

Comme allOf renvoie Void, récupérez les résultats en appelant join() sur chaque opération asynchrone individuelle après allOf.join().

List<CompletableFuture<String>> futures = List.of(
    fetchAsync("url1"), fetchAsync("url2"), fetchAsync("url3"));
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
    .thenApply(v -> futures.stream()
        .map(CompletableFuture::join)
        .collect(Collectors.toList()))
    .thenAccept(results -> results.forEach(System.out::println))
    .join();

anyOf : la première opération terminée l'emporte

CompletableFuture.anyOf(futures...) renvoie un CompletableFuture<Object> qui se termine avec le résultat de la première opération asynchrone terminée, quel que soit son type.

CompletableFuture<Object> first = CompletableFuture.anyOf(
    fetchFromCacheAsync(),
    fetchFromDbAsync(),
    fetchFromApiAsync()
);
System.out.println("Fastest result: " + first.join());

anyOf pour un délai d'attente avec solution de secours

Mettez en concurrence un calcul réel et une opération asynchrone de délai d'attente. Celle qui se termine la première l'emporte, ce qui permet d'implémenter un modèle de délai d'attente non bloquant.

CompletableFuture<String> real    = fetchDataAsync();
CompletableFuture<String> timeout = CompletableFuture
    .supplyAsync(() -> {
        try { Thread.sleep(2000); } catch (InterruptedException e) {}
        return "timeout-default";
    });
String result = (String) CompletableFuture.anyOf(real, timeout).join();

orTimeout (Java 9+)

orTimeout(time, unit) termine l'opération asynchrone avec TimeoutException si elle ne se termine pas à temps. C'est plus propre que le modèle manuel anyOf avec délai d'attente.

CompletableFuture<String> result = fetchDataAsync()
    .orTimeout(3, TimeUnit.SECONDS)
    .exceptionally(ex -> "timeout-default");
System.out.println(result.join());

Appels HTTP parallèles avec allOf

Lancez des appels vers plusieurs services en parallèle, puis regroupez les résultats. C'est bien plus rapide que des appels séquentiels lorsque les services sont indépendants.

List<String> urls = List.of(url1, url2, url3);
List<CompletableFuture<String>> futures = urls.stream()
    .map(url -> CompletableFuture.supplyAsync(() -> httpGet(url)))
    .collect(Collectors.toList());
List<String> responses = CompletableFuture
    .allOf(futures.toArray(new CompletableFuture[0]))
    .thenApply(v -> futures.stream().map(CompletableFuture::join).collect(Collectors.toList()))
    .join();

Gestion des erreurs dans allOf

Si une opération asynchrone de allOf échoue, l'opération asynchrone renvoyée échoue immédiatement. Entourez les opérations asynchrones individuelles de exceptionally pour éviter qu'un seul échec ne fasse échouer tout le lot.

List<CompletableFuture<String>> safe = futures.stream()
    .map(f -> f.exceptionally(ex -> "ERROR: " + ex.getMessage()))
    .collect(Collectors.toList());
CompletableFuture.allOf(safe.toArray(new CompletableFuture[0])).join();

allOf avec des types différents

allOf accepte des opérations asynchrones de types différents. Après les avoir rejointes, convertissez le résultat de chaque opération vers le type attendu.

CompletableFuture<User> userFuture   = fetchUser(id);
CompletableFuture<Config> configFuture = fetchConfig();
CompletableFuture.allOf(userFuture, configFuture).join();
User   user   = userFuture.join();
Config config = configFuture.join();

Composer allOf et thenApply

Enchaînez thenApply sur allOf pour agréger les résultats dès que toutes les opérations asynchrones sont terminées.

CompletableFuture<String> summary =
    CompletableFuture.allOf(f1, f2, f3)
        .thenApply(v -> "User: " + f1.join() +
                       ", Orders: " + f2.join().size() +
                       ", Balance: " + f3.join());
System.out.println(summary.join());

Considérations sur le pool de fils d'exécution

Toutes les opérations asynchrones d'un appel à allOf ou anyOf peuvent s'exécuter simultanément. Vérifiez que le pool de fils d'exécution dispose de suffisamment de fils, ou utilisez des fils virtuels (Java 21+) pour éviter la famine.

// With virtual threads (Java 21+):
ExecutorService vt = Executors.newVirtualThreadPerTaskExecutor();
CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> httpGet(url), vt);

Propagation des annulations

allOf et anyOf n'annulent pas automatiquement les opérations asynchrones restantes lorsqu'une opération se termine ou est annulée. Annulez-les individuellement si nécessaire.

CompletableFuture<Object> first = CompletableFuture.anyOf(f1, f2, f3);
first.thenRun(() -> Stream.of(f1, f2, f3).forEach(f -> f.cancel(true)));

Vérification rapide

Que renvoie CompletableFuture.anyOf ?

Bilan

allOf attend toutes les opérations asynchrones (regroupement). anyOf prend le premier résultat (mise en concurrence). Utilisez orTimeout pour les délais d'attente. Entourez les opérations asynchrones individuelles de exceptionally pour éviter qu'un seul échec ne fasse échouer le lot.

Questions Fréquemment Posées

La leçon « Combiner des futures : allOf et anyOf » est-elle gratuite ?

Oui — le texte complet de « Combiner des futures : allOf et anyOf » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Combiner des futures : allOf et anyOf » ?

Attendez tous les futures avec allOf et mettez-les en concurrence avec anyOf pour implémenter une logique de délai d’attente et de solution de repli. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Combiner des futures : allOf et anyOf » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Créer et terminer des CompletableFutures
  2. Enchaînement avec thenApply et thenCompose
  3. Combiner des futures : allOf et anyOf
  4. Gestion des erreurs et flux HTTP asynchrone
← Retour à Java Academy