logo

Mi az a CompletableFuture?

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
    supplyAsync():Aszinkron módon végzi a feladatát. A beszállító eredményét alapértelmezettként a ForkJoinPool.commonPool() feladat futtatja. A supplyAsync() metódus CompletableFuture-t adja vissza, amelyen más módszereket is alkalmazhatunk.akkor Alkalmaz():A metódus a függvényt argumentumként fogadja el. Új CompletableStage-et ad vissza, amikor ez a szakasz normálisan befejeződik. Az új szakasz a megadott függvény argumentumaként használható.csatlakozik():a metódus az eredmény értékét adja vissza, amikor befejeződött. Extrém kivételt is dob (nem bejelölt kivétel), ha kivételesen befejeződik.
 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:

CompletableFuture Java-ban

A CompletableFuture kivételes kezelése

Tekintsük a következő ábrát, amely az öt CF-et ábrázolja:

CompletableFuture Java-ban

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.

CompletableFuture Java-ban

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);