logo

Hvad er CompletableFuture?

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
    supplyAsync():Den fuldfører sit job asynkront. Resultatet af leverandør køres af en opgave fra ForkJoinPool.commonPool() som standard. SupplyAsync()-metoden returnerer CompletableFuture, som vi kan anvende andre metoder på.derefter Anvend():Metoden accepterer funktion som argumenter. Det returnerer en ny CompletableStage, når denne fase afsluttes normalt. Den nye fase bruges som argument til den leverede funktion.tilslutte():metoden returnerer resultatværdien, når den er fuldført. Det kaster også en CompletionException (umarkeret undtagelse), hvis den udføres undtagelsesvis.
 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

Undtagelseshåndtering af CompletableFuture

Overvej følgende figur, som repræsenterer de fem CF'er:

CompletableFuture i Java

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.

CompletableFuture i Java

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