A Compltable Future aszinkron programozáshoz használják. Az aszinkron programozás nem blokkoló kód írását jelenti. Egy feladatot a fő alkalmazásszáltól eltérő szálon futtat, és értesíti a fő szálat a folyamat előrehaladásáról, befejezéséről vagy meghibásodásáról.
Ily módon a főszál nem blokkol, és nem várja meg a feladat befejezését. A többi feladat párhuzamosan történik. A párhuzamosság javítja a program teljesítményét.
A CompletableFuture egy Java osztály. A java.util.cocurrent csomaghoz tartozik. Megvalósítja a CompletionStage és Future interfészt.
CompletionStage
- Műveletet hajt végre, és értéket ad vissza, amikor egy másik befejezési szakasz befejeződik.
- Modell egy olyan feladathoz, amely más feladatokat is kiválthat.
Ezért egy lánc eleme.
Ha egynél több szál kísérel meg befejezni – kivételesen befejezni vagy törölni egy CompletableFuture-t, akkor csak az egyiknek sikerül.
java bemenet
Future vs CompletableFuture
A CompletableFuture a Java Future API kiterjesztése, amelyet a Java 8-ban vezettek be.
A Future az aszinkron programozáshoz használatos. Két módszert kínál: isDone() és get(). A metódusok lekérik a számítás eredményét, amikor az befejeződik.
A jövő korlátai
- A Jövő nem lehet kölcsönösen teljes.
- Letiltás nélkül nem hajthatunk végre további műveleteket a Future eredményén.
- A Future nem rendelkezik kivételkezeléssel.
- Nem kombinálhatunk több jövőt.
A jövőnek sok korlátja van, ezért van a CompletableFuture. A CompletableFuture módszerek széles skáláját kínálja több Future létrehozására, láncolására és kombinálására. Átfogó kivételkezelési támogatással is rendelkezik.
Beteljesíthető jövő létrehozása
CompletableFuture-t csak a következő argumentummentes konstruktor használatával tudunk létrehozni.
CompletableFuture CompletableFuture = new CompletableFuture();
Példa
A leggyakrabban használt CompletableFuture módszerek a következők:
karaktert karakterláncra java-ban
import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } }
Kimenet:
A CompletableFuture kivételes kezelése
Tekintsük a következő ábrát, amely az öt CF-et ábrázolja:
Tegyük fel, hogy öt CF a végrehajtás alatt, és a CF21 kivételt ad, akkor az összes függő CF (CF31 és CF41) hibás. Ez azt jelenti:
- Az isCompletedExceptionally() metódus hívása true értékkel tér vissza.
- A get() hívás ExecutionException-t dob, amely a gyökér kivételt okozza.
Tekintsük a következő ábrát, amelyen a CF30-at hoztuk létre egy kivétellel.
Amikor a CF21 normálisan működik, akkor a CF30 csak továbbítja az értéket. Ha kivételt állít fel, a CF30 kezeli és értéket generál a CF31 számára.
Három módszer létezik a kivételek kezelésére:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);