Sobes.tech
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í:

  1. 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ů
    
  2. 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);
    });
    
  3. 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());