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
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:
Uitzonderingsafhandeling van CompletableFuture
Beschouw de volgende figuur, die de vijf CF’s weergeeft:
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.
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);