Sobes.tech
Middle

Wozu dient CompletableFuture in Java?

sobes.tech KI

Antwort von AI

CompletableFuture wird für die asynchrone Ausführung von Aufgaben und die Komposition asynchroner Operationen verwendet. Es stellt das Ergebnis einer asynchronen Operation dar, die in Zukunft abgeschlossen werden kann.

Hauptvorteile und Gründe für die Verwendung:

  • Asynchrone Ausführung: Ermöglicht die Ausführung von Aufgaben im Hintergrund, ohne den Haupt-Thread zu blockieren.
  • Komposition asynchroner Operationen: Ermöglicht das Verketteln mehrerer asynchroner Aufgaben, wobei festgelegt wird, wie sie sequenziell oder parallel ausgeführt werden sollen, und deren Ergebnisse verarbeitet werden.
  • Fehlerbehandlung: Bietet Mechanismen zur Behandlung von Fehlern bei asynchron ausgeführten Aufgaben.
  • Flexibilität: Unterstützt verschiedene Methoden zur Ergebnisverarbeitung (z.B. Anwendung von Funktionen, Ausführung der nächsten Aufgabe) und zur Festlegung der Ausführungsthreads.

Anwendungsbeispiele:

  1. Ausführen mehrerer unabhängiger Aufgaben parallel und auf deren Abschluss warten:

    // Beispiel für parallele Ausführung zweier Aufgaben
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Lange Operation 1
        return "Ergebnis 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Lange Operation 2
        return "Ergebnis 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Warten auf Abschluss beider Aufgaben
    
  2. Sequenzielle asynchrone Operationen:

    // Beispiel für sequenzielle Ausführung von Aufgaben
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Anfangswert");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Ergebnis umwandeln
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Länge der Zeichenkette: " + length);
    });
    
  3. Fehlerbehandlung:

    // Beispiel für Fehlerbehandlung
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Ein Fehler ist aufgetreten");
        }
        return "Erfolg";
    }).exceptionally(ex -> {
        System.err.println("Fehlerbehandlung: " + ex.getMessage());
        return "Behandelter Fehler"; // Ersatzwert
    });
    
    System.out.println(errorFuture.join());