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
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:
Unntakshåndtering av CompletableFuture
Tenk på følgende figur, som representerer de fem CF-ene:
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.
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);