logo

Hva er CompletableFuture?

EN CompltableFuture brukes til asynkron programmering. Asynkron programmering betyr å skrive ikke-blokkerende kode. Den kjører en oppgave på en separat tråd enn hovedprogramtråden og varsler hovedtråden om fremdriften, fullføringen eller feilen.

På denne måten blokkerer ikke hovedtråden eller venter på fullføring av oppgaven. Andre oppgaver utføres parallelt. Parallellisme forbedrer ytelsen til programmet.

En CompletableFuture er en klasse i Java. Den tilhører java.util.cocurrent-pakken. Den implementerer CompletionStage og Future-grensesnittet.

Fullføringsstadiet

  • Den utfører en handling og returnerer en verdi når en annen fullføringsfase fullfører.
  • En modell for en oppgave som kan utløse andre oppgaver.

Derfor er det et element i en kjede.

Når mer enn én tråd forsøker å fullføre – fullfør unntaksvis eller avbryt en CompletableFuture, er det bare én av dem som lykkes.

hva er rom

Future vs CompletableFuture

En CompletableFuture er en utvidelse til Javas Future API som ble introdusert i Java 8.

A Future brukes for asynkron programmering. Det gir to metoder, isDone() og get(). Metodene henter resultatet av beregningen når den er fullført.

Fremtidens begrensninger

  • En fremtid kan ikke være gjensidig komplett.
  • Vi kan ikke utføre ytterligere handling på en Futures resultat uten å blokkere.
  • Future har ingen unntakshåndtering.
  • Vi kan ikke kombinere flere fremtider.

Future har så mange begrensninger, det er derfor vi har CompletableFuture. CompletableFuture gir et bredt sett med metoder for å lage flere Futures, kjede og kombinere. Den har også omfattende støtte for unntakshåndtering.

Opprette en CompletableFuture

Vi kan lage en CompletableFuture bare ved å bruke følgende konstruktør uten argumenter.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Eksempel

De mest brukte CompletableFuture-metodene er:

konvertere streng til dato
    supplyAsync():Den fullfører jobben sin asynkront. Resultatet av leverandøren kjøres av en oppgave fra ForkJoinPool.commonPool() som standard. SupplyAsync()-metoden returnerer CompletableFuture som vi kan bruke andre metoder på.deretterBruk():Metoden aksepterer funksjon som argumenter. Den returnerer et nytt CompletableStage når dette stadiet fullføres normalt. Den nye scenen brukes som argument for den medfølgende funksjonen.bli med():metoden returnerer resultatverdien når den er fullført. Den kaster også et CompletionException (umerket unntak) hvis det fullføres unntaksvis.
 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; } } 

Produksjon:

CompletableFuture i Java

Unntakshåndtering av CompletableFuture

Tenk på følgende figur, som representerer de fem CF-ene:

CompletableFuture i Java

Anta at fem CF-er i utførelse og CF21 reiser et unntak, så er alle de avhengige CF-ene (CF31 og CF41) feil. Det betyr at:

  • Kallet til isCompletedExceptionally()-metoden returnerer true.
  • Kallet til get() kaster et ExecutionException som forårsaker root Exception.

Tenk på følgende figur, der vi har laget CF30 med et unntak.

CompletableFuture i Java

Når CF21 kjører normalt, sender CF30 bare verdien. Hvis det oppstår et unntak, håndterer CF30 det og genererer verdi for CF31.

Det er tre metoder for å håndtere et unntak:

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