Middle
Μιλήστε για την έννοια της κλάσης CompletableFuture.
sobes.tech AI
Απάντηση από AI
Το CompletableFuture είναι μια κλάση στη Java 8+ που υλοποιεί τις διεπαφές Future και CompletionStage. Αντιπροσωπεύει έναν ασύγχρονο υπολογισμό που μπορεί να ολοκληρωθεί (ή να αποτύχει) σε κάποιο σημείο στο μέλλον και πάνω στο αποτέλεσμα του μπορούν να εκτελεστούν επακόλουθες ενέργειες δηλωτικά, χωρίς να μπλοκάρει το κύριο νήμα.
Βασικές δυνατότητες:
- Ασύγχρονη εκτέλεση: Επιτρέπει την εκκίνηση εργασιών σε ξεχωριστό νήμα (ή ομάδα νημάτων).
- Σύνθεση: Μπορείτε να συνδυάσετε πολλά
CompletableFuture, δημιουργώντας αλυσίδες εξαρτώμενων ενεργειών. - Διαχείριση εξαιρέσεων: Παρέχει μεθόδους για την επεξεργασία σφαλμάτων ασύγχρονων υπολογισμών.
- Μη μπλοκαριστικές λειτουργίες: Το αποτέλεσμα ή η εξαίρεση επεξεργάζεται όταν το future ολοκληρώνεται, χωρίς ρητό
get()ήjoin().
Βασικές μέθοδοι:
- Δημιουργία:
supplyAsync(Supplier<T> supplier): Ξεκινά τονSupplierασύγχρονα και επιστρέφει έναCompletableFutureμε το αποτέλεσμα του.runAsync(Runnable runnable): Ξεκινά τονRunnableασύγχρονα και επιστρέφει έναCompletableFuture<Void>.completedFuture(T value): Δημιουργεί ένα ήδη ολοκληρωμένοCompletableFutureμε την καθορισμένη τιμή.
- Μετασχηματισμός:
thenApply(Function<T, U> fn): Εφαρμόζει μια λειτουργία στο αποτέλεσμα όταν το future ολοκληρώνεται.thenAccept(Consumer<T> action): Εκτελεί μια ενέργεια πάνω στο αποτέλεσμα όταν το future ολοκληρώνεται.thenRun(Runnable action): Εκτελεί μια ενέργεια όταν το future ολοκληρώνεται, αγνοώντας το αποτέλεσμα.thenCompose(Function<T, CompletionStage<U>> fn): Επιτρέπει την κατασκευή αλυσίδων, όπου το αποτέλεσμα ενός future χρησιμοποιείται για τη δημιουργία ενός άλλου.
- Συνδυασμός:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Συνδυάζει τα αποτελέσματα δύο futures.allOf(CompletableFuture<?>... cfs): Επιστρέφει έναCompletableFuture<Void>που ολοκληρώνεται όταν όλα τα δοθέντα futures ολοκληρωθούν.anyOf(CompletableFuture<?>... cfs): Επιστρέφει έναCompletableFuture<Object>που ολοκληρώνεται όταν οποιοδήποτε από τα δοθέντα futures ολοκληρωθεί.
- Επεξεργασία εξαιρέσεων:
exceptionally(Function<Throwable, T> fn): Διαχειρίζεται την εξαίρεση επιστρέφοντας εναλλακτική τιμή.handle(BiFunction<T, Throwable, U> fn): Διαχειρίζεται τόσο το αποτέλεσμα όσο και την εξαίρεση.
Παράδειγμα:
// Εκκίνηση ασύγχρονης εργασίας
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Προσομοίωση μακράς εργασίας
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Αποτέλεσμα ασύγχρονου χειρισμού";
});
// Εκτέλεση ενέργειας μετά την ολοκλήρωση της εργασίας (μη μπλοκαριστικά)
future.thenAccept(result -> {
System.out.println("Λήφθηκε αποτέλεσμα: " + result);
});
// Μια άλλη ενέργεια που εξαρτάται από την πρώτη
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Αποτέλεσμα σε κεφαλαία: " + upperCaseResult);
});
// Αναμονή όλων των εργασιών (σε πραγματικές εφαρμογές συνήθως αποφεύγουν το εμφανές get/join)
// future.join();
Το CompletableFuture είναι ένα ισχυρό εργαλείο για τη συγγραφή αντιδραστικού και μη μπλοκαριστικού κώδικα στη Java, απλοποιώντας σημαντικά τη δουλειά με την ασύγχρονη εκτέλεση σε σύγκριση με το κλασικό interface Future.