Middle
Porozprávajte o koncepte triedy CompletableFuture.
sobes.tech AI
Odpoveď od AI
CompletableFuture je trieda v Jave 8+ implementujúca rozhrania Future a CompletionStage. Predstavuje asynchrónny výpočet, ktorý môže byť dokončený (alebo zlyhať) v určitom momente v budúcnosti a nad jeho výsledkom je možné vykonávať následné akcie deklaratívne, bez blokovania hlavného vlákna.
Hlavné možnosti:
- Asynchrónne vykonávanie: Umožňuje spúšťanie úloh v samostatnom vlákne (alebo vláknovom poole).
- Kompozícia: Môžete spájať viac
CompletableFuture, vytvárajúc reťazce závislých akcií. - Správa výnimiek: Poskytuje metódy na spracovanie chýb asynchrónnych výpočtov.
- Neblokujúce operácie: Výsledok alebo výnimka sa spracováva, keď sa future dokončí, bez explicitného
get().
Kľúčové metódy:
- Vytváranie:
supplyAsync(Supplier<T> supplier): SpúšťaSupplierasynchrónne a vraciaCompletableFutures jeho výsledkom.runAsync(Runnable runnable): SpúšťaRunnableasynchrónne a vraciaCompletableFuture<Void>.completedFuture(T value): Vytvára už dokončenýCompletableFutures danou hodnotou.
- Transformácia:
thenApply(Function<T, U> fn): Aplikuje funkciu na výsledok, keď sa future dokončí.thenAccept(Consumer<T> action): Vykonáva akciu nad výsledkom, keď sa future dokončí.thenRun(Runnable action): Vykonáva akciu, keď sa future dokončí, ignorujúc výsledok.thenCompose(Function<T, CompletionStage<U>> fn): Umožňuje vytváranie reťazcov, kde výsledok jedného future je použitý na vytvorenie iného.
- Kombinácia:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Kombinuje výsledky dvoch futures.allOf(CompletableFuture<?>... cfs): VrátiCompletableFuture<Void>, ktorý sa dokončí, keď sa dokončia všetky zadané futures.anyOf(CompletableFuture<?>... cfs): VrátiCompletableFuture<Object>, ktorý sa dokončí, keď sa dokončí ktorýkoľvek z daných futures.
- Spracovanie výnimiek:
exceptionally(Function<Throwable, T> fn): Spracováva výnimku, vracajúc alternatívnu hodnotu.handle(BiFunction<T, Throwable, U> fn): Spracováva ako výsledok, tak výnimku.
Príklad:
// Spustenie asynchrónnej úlohy
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Imaginárna dlhá práca
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Výsledok asynchrónnej operácie";
});
// Vykonanie akcie po dokončení úlohy (neblokujúce)
future.thenAccept(result -> {
System.out.println("Získaný výsledok: " + result);
});
// Ešte jedna akcia, ktorá závisí od prvej
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Výsledok veľkými písmenami: " + upperCaseResult);
});
// Čakanie na všetky úlohy (v reálnych aplikáciách sa zvyčajne vyhýbajú explicitnému get/join)
// future.join();
CompletableFuture je mocný nástroj na písanie reaktívneho a neblokujúceho kódu v Jave, čo výrazne zjednodušuje prácu s asynchrónnosťou v porovnaní s klasickým rozhraním Future.