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ésanyOftípusú módszerek segítségével több feladat párhuzamosan futtatható.
Használati példák:
-
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")); -
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"; }); -
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 -
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 -
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 -
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.