logo

Vad är CompletableFuture?

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:

    supplyAsync():Den slutför sitt jobb asynkront. Resultatet av leverantören körs av en uppgift från ForkJoinPool.commonPool() som standard. Metoden supplyAsync() returnerar CompletableFuture som vi kan använda andra metoder på.använd sedan():Metoden accepterar funktion som argument. Den returnerar ett nytt CompletableStage när detta steg slutförs normalt. Det nya steget används som argument till den medföljande funktionen.Ansluta sig():metoden returnerar resultatvärdet när det är klart. Den kastar också ett CompletionException (omarkerat undantag) om det genomförs exceptionellt.
 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:

CompletableFuture i Java

Undantagshantering av CompletableFuture

Betrakta följande figur, som representerar de fem CF:erna:

CompletableFuture i Java

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
CompletableFuture i Java

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