EN CompltableFuture bruges til asynkron programmering. Asynkron programmering betyder at skrive ikke-blokerende kode. Den kører en opgave på en separat tråd end hovedprogramtråden og giver hovedtråden besked om dens fremskridt, afslutning eller fejl.
På denne måde blokerer eller venter hovedtråden ikke på færdiggørelsen af opgaven. Andre opgaver udføres parallelt. Parallelisme forbedrer programmets ydeevne.
En CompletableFuture er en klasse i Java. Det tilhører java.util.cocurrent-pakken. Det implementerer CompletionStage og Future-grænsefladen.
Fuldførelsesstadiet
- Den udfører en handling og returnerer en værdi, når endnu et færdiggørelsestrin er afsluttet.
- En model for en opgave, der kan udløse andre opgaver.
Derfor er det et element i en kæde.
Når mere end én tråd forsøger at fuldføre - fuldføre undtagelsesvis eller annullere en CompletableFuture, er det kun én af dem, der lykkes.
hvad er uri
Future vs CompletableFuture
En CompletableFuture er en udvidelse til Javas Future API, som blev introduceret i Java 8.
A Future bruges til asynkron programmering. Det giver to metoder, isDone() og get(). Metoderne henter resultatet af beregningen, når den er fuldført.
Fremtidens begrænsninger
- En fremtid kan ikke være gensidigt fuldstændig.
- Vi kan ikke udføre yderligere handling på en Futures resultat uden at blokere.
- Future har ingen undtagelseshåndtering.
- Vi kan ikke kombinere flere futures.
Future har så mange begrænsninger, det er derfor, vi har CompletableFuture. CompletableFuture giver et bredt sæt af metoder til at skabe flere Futures, kæde og kombinere. Det har også omfattende undtagelseshåndteringssupport.
Oprettelse af en komplet fremtid
Vi kan kun oprette en CompletableFuture ved at bruge følgende no-argument constructor.
CompletableFuture CompletableFuture = new CompletableFuture();
Eksempel
De mest anvendte CompletableFuture-metoder er:
xvideoservicethief ubuntu 14.04 download
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:
Undtagelseshåndtering af CompletableFuture
Overvej følgende figur, som repræsenterer de fem CF'er:
Antag, at fem CF'er udføres, og CF21 rejser en undtagelse, så er alle de afhængige CF'er (CF31 og CF41) fejlbehæftede. Det betyder at:
- Kaldet til metoden isCompletedExceptionally() returnerer true.
- Kaldet til get() kaster en ExecutionException, som forårsager root Exception.
Overvej følgende figur, hvor vi har oprettet CF30 med en undtagelse.
Når CF21 kører normalt, så sender CF30 bare værdien. Hvis det rejser en undtagelse, håndterer CF30 den og genererer værdi for CF31.
Der er tre metoder til at håndtere en undtagelse:
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);