logo

Wat is CompletableFuture?

A Compleerbare toekomst wordt gebruikt voor asynchrone programmering. Asynchroon programmeren betekent het schrijven van niet-blokkerende code. Het voert een taak uit op een andere thread dan de hoofdthread van de toepassing en informeert de hoofdthread over de voortgang, voltooiing of mislukking ervan.

Op deze manier blokkeert of wacht de hoofdthread niet op de voltooiing van de taak. Andere taken worden parallel uitgevoerd. Parallellisme verbetert de prestaties van het programma.

A CompletableFuture is een klasse in Java. Het behoort tot het java.util.cocurrent-pakket. Het implementeert de CompletionStage- en Future-interface.

Voltooiingsfase

  • Het voert een actie uit en retourneert een waarde wanneer een andere voltooiingsfase is voltooid.
  • Een model voor een taak die andere taken kan activeren.

Het is dus een onderdeel van een keten.

Wanneer meer dan één thread probeert een CompletableFuture te voltooien, bij uitzondering te voltooien of een CompletableFuture te annuleren, slaagt slechts één daarvan.

sed-opdracht

Toekomst versus voltooide toekomst

A CompletableFuture is een uitbreiding op Java's Future API die werd geïntroduceerd in Java 8.

A Future wordt gebruikt voor asynchrone programmering. Het biedt twee methoden: isDone() en get(). De methoden halen het resultaat van de berekening op wanneer deze is voltooid.

Beperkingen van de toekomst

  • Een toekomst kan niet wederzijds compleet zijn.
  • We kunnen geen verdere actie ondernemen op het resultaat van een Future zonder te blokkeren.
  • Future heeft geen uitzonderingsafhandeling.
  • We kunnen niet meerdere toekomsten combineren.

De toekomst heeft zoveel beperkingen, daarom hebben we CompletableFuture. CompletableFuture biedt een breed scala aan methoden voor het creëren van meerdere toekomsten, het koppelen en combineren ervan. Het biedt ook uitgebreide ondersteuning voor het afhandelen van uitzonderingen.

Een voltooide toekomst creëren

We kunnen alleen een CompletableFuture maken door de volgende constructor zonder argumenten te gebruiken.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Voorbeeld

De meest gebruikte CompletableFuture-methoden zijn:

faculteit in c
    supplyAsync():Het voltooit zijn taak asynchroon. Het resultaat van leverancier wordt standaard uitgevoerd door een taak van ForkJoinPool.commonPool(). De methode supplyAsync() retourneert CompletableFuture waarop we andere methoden kunnen toepassen.danToepassen():De methode accepteert functie als argument. Het retourneert een nieuwe CompletableStage wanneer deze fase normaal wordt voltooid. Het nieuwe stadium wordt gebruikt als argument voor de opgegeven functie.meedoen():de methode retourneert de resultaatwaarde wanneer deze voltooid is. Het genereert ook een CompletionException (niet-gecontroleerde uitzondering) als het uitzonderlijk wordt voltooid.
 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; } } 

Uitgang:

Voltooibare toekomst in Java

Uitzonderingsafhandeling van CompletableFuture

Beschouw de volgende figuur, die de vijf CF’s weergeeft:

Voltooibare toekomst in Java

Stel dat er vijf CF's in uitvoering zijn en CF21 een uitzondering veroorzaakt, dan hebben alle afhankelijke CF's (CF31 en CF41) een fout. Het betekent dat:

  • De aanroep van de methode isCompletedExceptionally() retourneert true.
  • De aanroep van get() genereert een ExecutionException die de root Exception veroorzaakt.

Beschouw de volgende afbeelding, waarin we CF30 met een uitzondering hebben gemaakt.

Voltooibare toekomst in Java

Wanneer CF21 normaal werkt, verzendt CF30 alleen de waarde. Als er een uitzondering optreedt, handelt CF30 deze af en genereert waarde voor CF31.

Er zijn drie methoden om een ​​uitzondering af te handelen:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);