A CompltableFuture används för asynkron programmering. Asynkron programmering innebär att man skriver icke-blockerande kod. Den kör en uppgift på en separat tråd än huvudprogramtråden och meddelar huvudtråden om dess framsteg, slutförande eller misslyckande.
På detta sätt blockerar inte huvudtråden eller väntar på att uppgiften är klar. Andra uppgifter utförs parallellt. Parallellism förbättrar programmets prestanda.
En CompletableFuture är en klass i Java. Det tillhör java.util.cocurrent-paketet. Den implementerar gränssnittet CompletionStage och Future.
CompletionStage
- Den utför en åtgärd och returnerar ett värde när ett annat slutförandesteg är klart.
- En modell för en uppgift som kan utlösa andra uppgifter.
Därför är det en del av en kedja.
När mer än en tråd försöker slutföra - slutför undantagsvis eller avbryter en CompletableFuture, lyckas bara en av dem.
bytes till strängpython
Future vs CompletableFuture
En CompletableFuture är ett tillägg till Javas Future API som introducerades i Java 8.
A Future används för asynkron programmering. Den tillhandahåller två metoder, isDone() och get(). Metoderna hämtar resultatet av beräkningen när den är klar.
Framtidens begränsningar
- En framtid kan inte vara ömsesidigt komplett.
- Vi kan inte utföra ytterligare åtgärder på en Futures resultat utan att blockera.
- Future har inget undantagshantering.
- Vi kan inte kombinera flera framtider.
Future har så många begränsningar, det är därför vi har CompletableFuture. CompletableFuture tillhandahåller en bred uppsättning metoder för att skapa flera Futures, kedja och kombinera. Den har också omfattande stöd för undantagshantering.
Skapa en komplett framtid
Vi kan skapa en CompletableFuture endast genom att använda följande konstruktor utan argument.
CompletableFuture CompletableFuture = new CompletableFuture();
Exempel
De vanligaste CompletableFuture-metoderna är:
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; } }
Produktion:
Undantagshantering av CompletableFuture
Betrakta följande figur, som representerar de fem CF:erna:
Antag att fem CF:er körs och CF21 höjer ett undantag, då är alla beroende CF:er (CF31 och CF41) felaktiga. Det betyder att:
- Anropet till metoden isCompletedExceptionally() returnerar true.
- Anropet till get() kastar ett ExecutionException som orsakar root Exception.
Betrakta följande figur, där vi har skapat CF30 med ett undantag.
sträng som array
När CF21 körs normalt, sänder CF30 bara värdet. Om det ger upphov till ett undantag, hanterar CF30 det och genererar värde för CF31.
Det finns tre metoder för att hantera ett undantag:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);