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