Forbedringer av Java 9 CompletableFuture API

1. Introduksjon

Java 9 kommer med noen endringer i Fullførbar fremtid klasse. Slike endringer ble introdusert som en del av JEP 266 for å adressere vanlige klager og forslag siden introduksjonen i JDK 8, nærmere bestemt støtte for forsinkelser og tidsavbrudd, bedre støtte for underklassering og noen få bruksmetoder.

Kodemessig kommer API med åtte nye metoder og fem nye statiske metoder. For å muliggjøre slike tillegg ble omtrent 1500 av 2400 kodelinjer endret (i henhold til Open JDK).

2. Instans API-tillegg

Som nevnt kommer forekomsten API med åtte nye tillegg, de er:

  1. Executor defaultExecutor ()
  2. CompletableFuture newIncompleteFuture ()
  3. CompletableFuture copy ()
  4. CompletionStage minimalCompletionStage ()
  5. Fullførbar Fremtid komplett Async (leverandørleverandør, eksekutorutfører)
  6. Fullførbar Fremtid komplett Async (leverandør leverandør)
  7. CompletableFuture orTimeout (lang tidsavbrudd, TimeUnit-enhet)
  8. CompletableFuture completeOnTimeout (T-verdi, lang tidsavbrudd, TimeUnit-enhet)

2.1. Metode defaultExecutor ()

Signatur: Executor defaultExecutor ()

Returnerer standard Leder brukes til asynkroniseringsmetoder som ikke spesifiserer en Leder.

ny CompletableFuture (). defaultExecutor ()

Dette kan overstyres av underklasser som returnerer en eksekutor som gir minst en uavhengig tråd.

2.2. Metode newIncompleteFuture ()

Signatur: CompletableFuture newIncompleteFuture ()

De newIncompleteFuture, også kjent som "virtuell konstruktør", brukes til å få en ny, fullstendig fremtidig forekomst av samme type.

new CompletableFuture (). newIncompleteFuture ()

Denne metoden er spesielt nyttig ved subklassering Fullførbar fremtid, hovedsakelig fordi den brukes internt i nesten alle metoder som returnerer en ny CompletionStage, slik at underklasser kan kontrollere hvilken undertype som returneres ved slike metoder.

2.3. Metode kopiere()

Signatur: CompletableFuture copy ()

Denne metoden returnerer en ny Fullførbar fremtid hvilken:

  • Når dette blir fullført normalt, blir den nye også fullført normalt
  • Når dette blir fullført unntaksvis med unntak X, fullføres den nye også unntaksvis med en CompletionException med X som årsak
ny CompletableFuture (). kopi ()

Denne metoden kan være nyttig som en form for “defensiv kopiering”, for å forhindre at klienter fullfører, mens de fremdeles er i stand til å arrangere avhengige handlinger på en bestemt forekomst av Fullførbar fremtid.

2.4. Metode minimalCompletionStage ()

Signatur: CompletionStage minimalCompletionStage ()

Denne metoden returnerer en ny CompletionStage som oppfører seg på nøyaktig samme måte som beskrevet av kopimetoden, men en slik ny forekomst kaster Ikke-støttetOperationException i hvert forsøk på å hente eller angi den løste verdien.

ny CompletableFuture (). minimalCompletionStage ()

En ny Fullførbar fremtid med alle tilgjengelige metoder kan hentes ved å bruke toCompletableFuture metoden tilgjengelig på CompletionStage API.

2.5. Metoder completeAsync ()

De completeAsync metoden skal brukes til å fullføre Fullførbar fremtid asynkront ved hjelp av verdien gitt av Leverandør sørget for.

Underskrifter:

CompletableFuture completeAsync (Leverandørleverandør, Executor executor) CompletableFuture completeAsync (Leverandørleverandør)

Forskjellen mellom disse to overbelastede metodene er eksistensen av det andre argumentet, der Leder kjører oppgaven kan spesifiseres. Hvis ingen er gitt, vil standardutføreren (returneres av defaultExecutor metode) vil bli brukt.

2.6. Metoder orTimeout ()

Signatur: CompletableFuture orTimeout (lang tidsavbrudd, TimeUnit-enhet)

new CompletableFuture (). orTimeout (1, TimeUnit.SECONDS)

Løser Fullførbar fremtid unntaksvis med TimeoutException, med mindre den er fullført før angitt tidsavbrudd.

2.7. Metode completeOnTimeout ()

Signatur: CompletableFuture completeOnTimeout (T-verdi, lang tidsavbrudd, TimeUnit-enhet)

new CompletableFuture (). completeOnTimeout (verdi, 1, TimeUnit.SECONDS)

Fullfører Fullførbar fremtid normalt med den angitte verdien med mindre den er fullført før den angitte tidsavbruddet.

3. Statisk API-tillegg

Noen verktøymetoder ble også lagt til. De er:

  1. Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit-enhet, Eksekutørutfører)
  2. Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit-enhet)
  3. CompletionStage completedStage (U-verdi)
  4. CompletionStage failedStage (Throwable ex)
  5. CompletableFuture failedFuture (Throwable ex)

3.1. Metoder delayedExecutor

Underskrifter:

Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit-enhet, Eksekutørutfører) Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit-enhet)

Returnerer en ny Leder som sender en oppgave til den gitte baseutføreren etter den gitte forsinkelsen (eller ingen forsinkelse hvis den ikke er positiv). Hver forsinkelse begynner ved påkallelse av den returnerte eksekutørens utførelsesmetode. Hvis ingen eksekverer er spesifisert, er standardutføreren (ForkJoinPool.commonPool ()) vil bli brukt.

3.2. Metoder fullført trinn og failedStage

Underskrifter:

 CompletionStage completedStage (U-verdi) CompletionStage failedStage (Throwable ex)

Denne verktøymetoden returnerer allerede løst CompletionStage tilfeller, enten fullført normalt med en verdi (fullført trinn) eller fullført unntaksvis (failedStage) med gitt unntak.

3.3. Metode failedFuture

Signatur: CompletableFuture failedFuture (Throwable ex)

FailedFuture-metoden legger til muligheten til å spesifisere en allerede fullført unntaksvis Fullstendig fremtid forekomst.

4. Eksempel på brukstilfeller

Innenfor denne delen vil man vise noen eksempler på hvordan du bruker noen av den nye API-en.

4.1. Forsinkelse

Dette eksemplet viser hvordan du kan forsinke fullføringen av en Fullførbar fremtid med en bestemt verdi med ett sekund. Dette kan oppnås ved å bruke completeAsync metode sammen med delayedExecutor.

CompletableFuture future = new CompletableFuture (); future.completeAsync (() -> input, CompletableFuture.delayedExecutor (1, TimeUnit.SECONDS));

4.2. Komplett med verdi på tidsavbrudd

En annen måte å oppnå et forsinket resultat på er å bruke completeOnTimeout metode. Dette eksemplet definerer a Fullførbar fremtid som vil bli løst med en gitt inngang hvis den ikke er løst etter 1 sekund.

CompletableFuture future = new CompletableFuture (); future.completeOnTimeout (input, 1, TimeUnit.SECONDS);

4.3. Pause

En annen mulighet er timing som løser fremtiden eksepsjonelt med TimeoutException. For eksempel å ha Fullførbar fremtid tidsavbrudd etter 1 sekund gitt at det ikke er fullført før det.

CompletableFuture future = new CompletableFuture (); future.orTimeout (1, TimeUnit.SECONDS);

5. Konklusjon

Avslutningsvis kommer Java 9 med flere tillegg til Fullførbar fremtid API, den har nå bedre støtte for underklassering, takket være newIncompleteFuture virtuell konstruktør, er det mulig å ta kontroll over CompletionStage forekomster returnerte i det meste av CompletionStage API.

Det har definitivt bedre støtte for forsinkelser og tidsavbrudd som vist tidligere. Verktøysmetodene som er lagt til følger et fornuftig mønster som gir Fullførbar fremtid en praktisk måte å spesifisere løste forekomster på.

Eksemplene som brukes i denne artikkelen finner du i GitHub-depotet vårt.


$config[zx-auto] not found$config[zx-overlay] not found