Middle
Na co je v Javě potřeba CompletableFuture?
sobes.tech AI
Odpověď od AI
CompletableFuture se používá pro asynchronní vykonávání úkolů a skládání asynchronních operací. Představuje výsledek asynchronní operace, který může být dokončen v budoucnu.
Hlavní výhody a důvody pro použití:
- Asynchronní vykonávání: Umožňuje vykonávat úkoly na pozadí, aniž by blokoval hlavní vlákno.
- Skládání asynchronních operací: Umožňuje řetězení několika asynchronních úkolů, určující, jak mají být prováděny sekvenčně nebo paralelně, a zpracování jejich výsledků.
- Zpracování výjimek: Poskytuje mechanismy pro správu chyb v asynchronních úkolech.
- Flexibilita: Podporuje různé metody pro zpracování výsledku (například použití funkcí, provedení následujícího úkolu) a určení vláken provádění.
Příklady použití:
-
Spuštění několika nezávislých úkolů paralelně a čekání na jejich dokončení:
// Příklad paralelního spuštění dvou úkolů CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { // Dlouhá operace 1 return "Výsledek 1"; }); CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { // Dlouhá operace 2 return "Výsledek 2"; }); CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2); combinedFuture.join(); // Čekání na dokončení obou úkolů -
Sekvenční asynchronní operace:
// Příklad sekvenčního provádění úkolů CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Počáteční hodnota"); CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> { // Převod výsledku return result.length(); }); transformedFuture.thenAccept(length -> { System.out.println("Délka řetězce: " + length); }); -
Zpracování výjimek:
// Příklad zpracování výjimek CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> { if (true) { throw new RuntimeException("Došlo k chybě"); } return "Úspěch"; }).exceptionally(ex -> { System.err.println("Zpracování chyby: " + ex.getMessage()); return "Chyba zpracována"; // Náhradní hodnota }); System.out.println(errorFuture.join());