Sobes.tech
Middle

Miért szükséges a CompletableFuture Java-ban?

sobes.tech MI

Válasz az MI-től

A CompletableFuture az aszinkron feladatok végrehajtására és az aszinkron műveletek összefűzésére szolgál. Egy aszinkron művelet eredményét képviseli, amely a jövőben befejeződhet.

Fő előnyei és okok a használatra:

  • Aszinkron végrehajtás: Lehetővé teszi feladatok háttérben történő végrehajtását anélkül, hogy blokkolná a fő szálat.
  • Aszinkron műveletek összefűzése: Több aszinkron feladat összekapcsolását teszi lehetővé, meghatározva, hogyan kell őket sorban vagy párhuzamosan végrehajtani, és eredményeiket feldolgozni.
  • Kivételkezelés: Mechanizmusokat biztosít a hibák kezelésére az aszinkron feladatokban.
  • Rugalmasság: Támogat különböző módszereket az eredmény feldolgozására (pl. függvény alkalmazása, következő feladat végrehajtása) és a végrehajtási szálak meghatározására.

Használati példák:

  1. Több független feladat párhuzamos végrehajtása és azok befejeződésének várása:

    // Két feladat párhuzamos végrehajtásának példája
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // Hosszú művelet 1
        return "Eredmény 1";
    });
    
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
        // Hosszú művelet 2
        return "Eredmény 2";
    });
    
    CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
    
    combinedFuture.join(); // Várakozás mindkét feladat befejezésére
    
  2. Szekvenciális aszinkron műveletek:

    // Szekvenciális végrehajtás példája
    CompletableFuture<String> initialFuture = CompletableFuture.supplyAsync(() -> "Kezdőérték");
    
    CompletableFuture<Integer> transformedFuture = initialFuture.thenApplyAsync(result -> {
        // Eredmény átalakítása
        return result.length();
    });
    
    transformedFuture.thenAccept(length -> {
        System.out.println("Sztring hossza: " + length);
    });
    
  3. Kivételkezelés:

    // Kivételkezelés példája
    CompletableFuture<String> errorFuture = CompletableFuture.supplyAsync(() -> {
        if (true) {
            throw new RuntimeException("Hiba történt");
        }
        return "Siker";
    }).exceptionally(ex -> {
        System.err.println("Hiba kezelése: " + ex.getMessage());
        return "Kezelt hiba"; // Tartalék érték
    });
    
    System.out.println(errorFuture.join());