Τι είναι το CompletableFuture;
sobes.tech AI
Απάντηση από AI
Το CompletableFuture στην Java 8+ αποτελεί επέκταση του μοντέλου Future, προσθέτοντας δυνατότητες ασύγχρονης προγραμματισμού και σύνθεσης εργασιών.
Υλοποιεί τις διεπαφές CompletionStage και Future. Το CompletionStage ορίζει το συμβόλαιο για ασύγχρονη εκτέλεση και σύνθεση βημάτων υπολογισμού.
Βασικά χαρακτηριστικά:
- Μη μπλοκαριστικές λειτουργίες: Επιτρέπει την εκτέλεση εργασιών ασύγχρονα, χωρίς να μπλοκάρει το κύριο νήμα.
- Σύνθεση: Παρέχει πλούσιο API για σύνδεση και συνένωση αποτελεσμάτων πολλαπλών ασύγχρονων λειτουργιών.
- Διαχείριση εξαιρέσεων: Ενσωματωμένοι μηχανισμοί για διαχείριση σφαλμάτων σε ασύγχρονα ρεύματα.
- Δημιουργία: Μπορείτε να δημιουργήσετε ολοκληρωμένα, μη ολοκληρωμένα ή λανθασμένα
CompletableFuture. - Εξαρτήσεις: Επιτρέπει τη δημιουργία αλυσίδων εξαρτώμενων εργασιών, όπου η εκτέλεση μιας εξαρτάται από την ολοκλήρωση άλλης.
- Παράλληλη εκτέλεση: Μέθοδοι όπως
allOfκαιanyOfγια παράλληλη εκτέλεση πολλαπλών εργασιών.
Παραδείγματα χρήσης:
-
Δημιουργία και ολοκλήρωση:
// Δημιουργία ολοκληρωμένου CompletableFuture CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Γειά"); // Δημιουργία μη ολοκληρωμένου CompletableFuture και ολοκλήρωσή του αργότερα CompletableFuture<String> future = new CompletableFuture<>(); // ... εκτέλεση ασύγχρονης εργασίας ... future.complete("Ολοκληρώθηκε"); // Ή σε περίπτωση σφάλματος // future.completeExceptionally(new RuntimeException("Σφάλμα")); -
Εκτέλεση ασύγχρονης εργασίας:
CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> { // Ασύγχρονη εργασία (π.χ. ανάγνωση από αρχείο, δικτυακό αίτημα) try { Thread.sleep(1000); } catch (InterruptedException e) { throw new IllegalStateException(e); } return "Ασύγχρονο αποτέλεσμα"; }); -
Σύνθεση με
thenApply:CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10) .thenApply(x -> x * 2); // Το αποτέλεσμα του προηγούμενου βήματος περνάει στη συνάρτηση -
Σύνθεση με
thenCombine:CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20); CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Συνένωση αποτελεσμάτων δύο CompletableFuture -
Επεξεργασία ολοκλήρωσης με
thenAccept:CompletableFuture.supplyAsync(() -> "Τελικό αποτέλεσμα") .thenAccept(result -> System.out.println("Η εργασία ολοκληρώθηκε με αποτέλεσμα: " + result)); // Εκτέλεση ενέργειας μετά την ολοκλήρωση χωρίς επιστροφή τιμής -
Επεξεργασία εξαιρέσεων με
exceptionally:CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> { throw new RuntimeException("Κάτι πήγε στραβά"); }).exceptionally(ex -> { System.err.println("Παρουσιάστηκε σφάλμα: " + ex.getMessage()); return "Προεπιλεγμένη τιμή"; // Επιστροφή προεπιλεγμένης τιμής σε περίπτωση σφάλματος });
Το CompletableFuture απλοποιεί σημαντικά τη συγγραφή ασύγχρονου και μη μπλοκαριστικού κώδικα στην Java, καθιστώντας τον πιο αναγνώσιμο και εύκολα διαχειρίσιμο σε σύγκριση με παραδοσιακά callback ή μπλοκαρίσματα με Future.get().