Sobes.tech
Middle

Meséljen a CompletableFuture osztály fogalmáról.

sobes.tech MI

Válasz az MI-től

A CompletableFuture egy Java 8+ osztály, amely megvalósítja a Future és CompletionStage interfészeket. Egy aszinkron számítást képvisel, amely valamikor a jövőben befejeződhet (vagy hibát dobhat), és az eredményén deklaratív módon hajthatunk végre további műveleteket, anélkül, hogy blokkolnánk a fő szálat.

Főbb lehetőségek:

  • Aszinkron végrehajtás: Lehetővé teszi feladatok indítását külön szálon (vagy szálmedencében).
  • Összetétel: Több CompletableFuture összekapcsolása, függő műveletsorozatok létrehozása.
  • Kivételkezelés: Metódusokat kínál az aszinkron számítások hibáinak kezelésére.
  • Nem blokkoló műveletek: Az eredményt vagy kivételt akkor dolgozza fel, amikor a future befejeződik, anélkül, hogy explicit get()-et vagy join()-t kellene hívni.

Főbb módszerek:

  • Létrehozás:
    • supplyAsync(Supplier<T> supplier): Aszinkron módon indítja a Supplier-t, és egy CompletableFuture-t ad vissza az eredménnyel.
    • runAsync(Runnable runnable): Aszinkron módon indítja a Runnable-t, és egy CompletableFuture<Void>-t ad vissza.
    • completedFuture(T value): Már befejezett CompletableFuture-t hoz létre a megadott értékkel.
  • Átalakítás:
    • thenApply(Function<T, U> fn): Alkalmaz egy függvényt az eredményen, amikor a future befejeződik.
    • thenAccept(Consumer<T> action): Végrehajt egy műveletet az eredményen, amikor a future befejeződik.
    • thenRun(Runnable action): Végrehajt egy műveletet, amikor a future befejeződik, figyelmen kívül hagyva az eredményt.
    • thenCompose(Function<T, CompletionStage<U>> fn): Lehetővé teszi láncolások építését, ahol egy future eredményét felhasználva hozunk létre egy másikat.
  • Kombinálás:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Két future eredményét egyesíti.
    • allOf(CompletableFuture<?>... cfs): Egy CompletableFuture<Void>-t ad vissza, amely akkor fejeződik be, amikor az összes megadott future befejeződik.
    • anyOf(CompletableFuture<?>... cfs): Egy CompletableFuture<Object>-t ad vissza, amely akkor fejeződik be, amikor bármelyik megadott future befejeződik.
  • Kivételkezelés:
    • exceptionally(Function<Throwable, T> fn): Kezeli a kivételt, alternatív értéket adva vissza.
    • handle(BiFunction<T, Throwable, U> fn): Kezeli mind az eredményt, mind a kivételt.

Példa:

// Aszinkron feladat indítása
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Hosszú munka szimulálása
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Aszinkron művelet eredménye";
});

// Művelet végrehajtása a feladat befejezése után (nem blokkoló)
future.thenAccept(result -> {
    System.out.println("Eredmény: " + result);
});

// Egy másik művelet, amely az elsőtől függ
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Nagybetűs eredmény: " + upperCaseResult);
      });

// Minden feladat várása (valós alkalmazásokban általában elkerülik a nyilvános get/join használatát)
// future.join();

A CompletableFuture erőteljes eszköz a reaktív és nem blokkoló kód írásához Java-ban, jelentősen egyszerűsítve az aszinkronitással való munkát a hagyományos Future interfészhez képest.