0Pricing
Java Academy · Lektion

Futures kombinieren: allOf und anyOf

Warten Sie mit allOf auf alle Futures und führen Sie mit anyOf einen Wettlauf durch, um Timeout- und Fallback-Logik umzusetzen.

Futures kombinieren: allOf und anyOf ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Futures kombinieren?

Wenn unabhängige asynchrone Aufgaben parallel ausgeführt werden können, möchten Sie vor dem Fortfahren auf den Abschluss aller Aufgaben oder der ersten Aufgabe warten. allOf und anyOf unterstützen beide Fälle.

allOf: Auf alle Futures warten

CompletableFuture.allOf(futures...) gibt ein CompletableFuture<Void> zurück, das abgeschlossen wird, sobald ALLE Eingabe-Futures abgeschlossen sind. Wenn eines fehlschlägt, schlägt auch allOf fehl.

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

Ergebnisse von allOf sammeln

Da allOf den Typ Void zurückgibt, sammeln Sie die Ergebnisse, indem Sie nach allOf.join() für jedes einzelne Future join() aufrufen.

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: Das zuerst abgeschlossene Future gewinnt

CompletableFuture.anyOf(futures...) gibt ein CompletableFuture<Object> zurück, das mit dem Ergebnis des zuerst abgeschlossenen Futures abgeschlossen wird, unabhängig von dessen Typ.

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

anyOf als Timeout-Fallback

Starten Sie einen Wettlauf zwischen einer echten Berechnung und einem Timeout-Future. Das Future, das zuerst abgeschlossen wird, gewinnt – so lässt sich ein nicht blockierendes Timeout-Muster implementieren.

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) schließt das Future mit einer TimeoutException ab, wenn es nicht rechtzeitig fertig wird. Das ist sauberer als das manuelle anyOf-Timeout-Muster.

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

Parallele HTTP-Aufrufe mit allOf

Starten Sie Aufrufe an mehrere Services parallel und führen Sie anschließend die Ergebnisse zusammen. Bei unabhängigen Services ist das deutlich schneller als sequenzielle Aufrufe.

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

Fehlerbehandlung in allOf

Wenn ein Future in allOf fehlschlägt, schlägt das zurückgegebene Future sofort fehl. Verpacken Sie einzelne Futures mit exceptionally, damit ein einzelner Fehler nicht den gesamten Batch fehlschlagen lässt.

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 mit unterschiedlichen Typen

allOf akzeptiert Futures unterschiedlicher Typen. Wandeln Sie nach dem Zusammenführen das Ergebnis jedes Futures in den erwarteten Typ um.

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

allOf und thenApply kombinieren

Verketten Sie thenApply mit allOf, um Ergebnisse zu aggregieren, sobald alle Futures abgeschlossen sind.

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

Überlegungen zum Thread-Pool

Alle Futures in einem Aufruf von allOf oder anyOf können gleichzeitig ausgeführt werden. Stellen Sie sicher, dass der Thread-Pool genügend Threads besitzt, oder verwenden Sie virtuelle Threads (Java 21+), um eine Verknappung zu vermeiden.

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

Weitergabe von Abbrüchen

allOf und anyOf brechen verbleibende Futures nicht automatisch ab, wenn eines abgeschlossen oder abgebrochen wird. Brechen Sie bei Bedarf jedes Future einzeln ab.

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

Schnelltest

Was gibt CompletableFuture.anyOf zurück?

Zusammenfassung

allOf wartet auf alle Futures (Fan-in). anyOf verwendet das erste Ergebnis (Wettlauf). Verwenden Sie orTimeout für Timeouts. Verpacken Sie einzelne Futures mit exceptionally, damit ein einzelner Fehler nicht den gesamten Batch fehlschlagen lässt.

Häufig gestellte Fragen

Ist die Lektion „Futures kombinieren: allOf und anyOf“ kostenlos?

Ja — der vollständige Text von „Futures kombinieren: allOf und anyOf“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Futures kombinieren: allOf und anyOf“?

Warten Sie mit allOf auf alle Futures und führen Sie mit anyOf einen Wettlauf durch, um Timeout- und Fallback-Logik umzusetzen. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Futures kombinieren: allOf und anyOf“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. CompletableFutures erstellen und abschließen
  2. Verketten mit thenApply und thenCompose
  3. Futures kombinieren: allOf und anyOf
  4. Fehlerbehandlung und asynchrone HTTP-Pipeline
← Zurück zu Java Academy