Middle
Meséljen a CompletableFuture osztály fogalmáról.
sobes.tech MI
Válasz az MI-től
A CompletableFuture egy Java 8+ osztály, amely megvalósítja a Future és CompletionStage interfészeket. Egy aszinkron számítást képvisel, amely valamikor a jövőben befejeződhet (vagy hibát dobhat), és az eredményén deklaratív módon hajthatunk végre további műveleteket, anélkül, hogy blokkolnánk a fő szálat.
Főbb lehetőségek:
- Aszinkron végrehajtás: Lehetővé teszi feladatok indítását külön szálon (vagy szálmedencében).
- Összetétel: Több
CompletableFutureösszekapcsolása, függő műveletsorozatok létrehozása. - Kivételkezelés: Metódusokat kínál az aszinkron számítások hibáinak kezelésére.
- Nem blokkoló műveletek: Az eredményt vagy kivételt akkor dolgozza fel, amikor a future befejeződik, anélkül, hogy explicit
get()-et vagyjoin()-t kellene hívni.
Főbb módszerek:
- Létrehozás:
supplyAsync(Supplier<T> supplier): Aszinkron módon indítja aSupplier-t, és egyCompletableFuture-t ad vissza az eredménnyel.runAsync(Runnable runnable): Aszinkron módon indítja aRunnable-t, és egyCompletableFuture<Void>-t ad vissza.completedFuture(T value): Már befejezettCompletableFuture-t hoz létre a megadott értékkel.
- Átalakítás:
thenApply(Function<T, U> fn): Alkalmaz egy függvényt az eredményen, amikor a future befejeződik.thenAccept(Consumer<T> action): Végrehajt egy műveletet az eredményen, amikor a future befejeződik.thenRun(Runnable action): Végrehajt egy műveletet, amikor a future befejeződik, figyelmen kívül hagyva az eredményt.thenCompose(Function<T, CompletionStage<U>> fn): Lehetővé teszi láncolások építését, ahol egy future eredményét felhasználva hozunk létre egy másikat.
- Kombinálás:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Két future eredményét egyesíti.allOf(CompletableFuture<?>... cfs): EgyCompletableFuture<Void>-t ad vissza, amely akkor fejeződik be, amikor az összes megadott future befejeződik.anyOf(CompletableFuture<?>... cfs): EgyCompletableFuture<Object>-t ad vissza, amely akkor fejeződik be, amikor bármelyik megadott future befejeződik.
- Kivételkezelés:
exceptionally(Function<Throwable, T> fn): Kezeli a kivételt, alternatív értéket adva vissza.handle(BiFunction<T, Throwable, U> fn): Kezeli mind az eredményt, mind a kivételt.
Példa:
// Aszinkron feladat indítása
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Hosszú munka szimulálása
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Aszinkron művelet eredménye";
});
// Művelet végrehajtása a feladat befejezése után (nem blokkoló)
future.thenAccept(result -> {
System.out.println("Eredmény: " + result);
});
// Egy másik művelet, amely az elsőtől függ
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Nagybetűs eredmény: " + upperCaseResult);
});
// Minden feladat várása (valós alkalmazásokban általában elkerülik a nyilvános get/join használatát)
// future.join();
A CompletableFuture erőteljes eszköz a reaktív és nem blokkoló kód írásához Java-ban, jelentősen egyszerűsítve az aszinkronitással való munkát a hagyományos Future interfészhez képest.