Sobes.tech
Middle

Na čo je v Jave potrebný CompletableFuture?

sobes.tech AI

Odpoveď od AI

CompletableFuture sa používa na asynchrónne vykonávanie úloh a kompozíciu asynchrónnych operácií. Predstavuje výsledok asynchrónnej operácie, ktorý môže byť dokončený v budúcnosti.

Hlavné výhody a dôvody na použitie:

  • Asynchrónne vykonávanie: Umožňuje vykonávať úlohy na pozadí, bez blokovania hlavného vlákna.
  • Kompozícia asynchrónnych operácií: Dáva možnosť spájať viac asynchrónnych úloh, určujúc, ako majú byť vykonávané postupne alebo paralelne, a spracovávať ich výsledky.
  • Spracovanie výnimiek: Poskytuje mechanizmy na spracovanie chýb v asynchrónne vykonávaných úlohách.
  • Flexibilita: Podpora rôznych metód na spracovanie výsledku (napríklad použitie funkcie, vykonanie nasledujúcej úlohy) a definovanie tokov vykonávania.

Príklady použitia:

  1. Vykonávanie viacerých nezávislých úloh paralelne a čakanie na ich dokončenie:

    // Príklad paralelného vykonávania dvoch úloh
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Dlhá operácia 1
        return "Výsledok 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Dlhá operácia 2
        return "Výsledok 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Čakanie na dokončenie oboch úloh
    
  2. Vykonávanie po sebe nasledujúcich asynchrónnych operácií:

    // Príklad po sebe nasledujúcich úloh
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Počiatočná hodnota");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Prevod výsledku
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Dĺžka reťazca: " + length);
    });
    
  3. Spracovanie výnimiek:

    // Príklad spracovania výnimky
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Vyskytla sa chyba");
        }
        return "Úspech";
    }).exceptionally(ex -> {
        System.err.println("Spracovanie chyby: " + ex.getMessage());
        return "Spracovaná chyba"; // Náhradná hodnota
    });
    
    System.out.println(errorFuture.join());