Sobes.tech
Middle

Mi az a CompletableFuture?

sobes.tech MI

Válasz az MI-től

A CompletableFuture a Java 8+-ben a Future modell kiterjesztése, amely aszinkron programozási és feladatkompozíciós lehetőségeket ad hozzá.

Megvalósítja a CompletionStage és Future interfészeket. A CompletionStage szerződést határoz meg az aszinkron végrehajtásra és a számítási lépések összekapcsolására.

Fő jellemzők:

  • Blokkolásmentes műveletek: Lehetővé teszi feladatok aszinkron végrehajtását, anélkül, hogy blokkolná a fő szálat.
  • Összekapcsolás: Gazdag API-t kínál több aszinkron művelet eredményeinek összekapcsolására és egyesítésére.
  • Kivételkezelés: Beépített mechanizmusok a hibák kezelésére az aszinkron folyamatokban.
  • Létrehozás: Létrehozhat befejezett, befejezetlen vagy hibás CompletableFuture-eket.
  • Függőségek: Láncokat hozhat létre, ahol egy feladat végrehajtása egy másik befejezésétől függ.
  • Párhuzamos végrehajtás: Az allOf és anyOf típusú módszerek segítségével több feladat párhuzamosan futtatható.

Használati példák:

  1. Létrehozás és befejezés:

    // Befejezett CompletableFuture létrehozása
    CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Helló");
    
    // Befejezetlen CompletableFuture létrehozása és későbbi befejezése
    CompletableFuture<String> future = new CompletableFuture<>();
    // ... aszinkron munka végrehajtása ...
    future.complete("Kész");
    // Vagy hiba esetén
    // future.completeExceptionally(new RuntimeException("Hiba"));
    
  2. Aszinkron feladat végrehajtása:

    CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> {
        // Aszinkron munka (pl. fájlból olvasás, hálózati kérés)
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
        return "Aszinkron eredmény";
    });
    
  3. thenApply-vel való összekapcsolás:

    CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10)
        .thenApply(x -> x * 2); // Az előző lépés eredménye átadódik a függvénynek
    
  4. thenCombine-nal való összekapcsolás:

    CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
    CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
    
    CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Két CompletableFuture eredményének egyesítése
    
  5. Befejezés kezelése thenAccept-tel:

    CompletableFuture.supplyAsync(() -> "Végső eredmény")
        .thenAccept(result -> System.out.println("Feladat befejeződött eredménnyel: " + result)); // Cselekvés végrehajtása a befejezés után, érték visszaadása nélkül
    
  6. Kivételkezelés exceptionally-el:

    CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> {
        throw new RuntimeException("Valami rosszra fordult");
    }).exceptionally(ex -> {
        System.err.println("Hiba történt: " + ex.getMessage());
        return "Alapértelmezett érték"; // Alapértelmezett érték visszaadása hiba esetén
    });
    

A CompletableFuture jelentősen egyszerűsíti az aszinkron és nem blokkoló kód írását Java-ban, olvashatóbbá és könnyebben karbantarthatóvá téve azt a hagyományos callback-ek vagy a Future.get() blokkoló hívásokhoz képest.