Forbedringer af Java 9 CompletableFuture API

1. Introduktion

Java 9 kommer med nogle ændringer til Fuldført klasse. Sådanne ændringer blev introduceret som en del af JEP 266 for at imødegå almindelige klager og forslag siden introduktionen i JDK 8, mere specifikt støtte til forsinkelser og timeouts, bedre support til underklassificering og et par hjælpemetoder.

Kodemæssigt leveres API med otte nye metoder og fem nye statiske metoder. For at muliggøre sådanne tilføjelser blev ca. 1500 ud af 2400 kodelinjer ændret (som pr. Open JDK).

2. Instans API-tilføjelser

Som nævnt kommer forekomsten API med otte nye tilføjelser, de er:

  1. Executor defaultExecutor ()
  2. CompletableFuture newIncompleteFuture ()
  3. CompletableFuture kopi ()
  4. CompletionStage minimalCompletionStage ()
  5. Kompletabel Fremtid komplet Async (leverandør leverandør, eksekutor eksekutor)
  6. Kompletabel Fremtid komplet Async (leverandør leverandør)
  7. CompletableFuture ellerTimeout (lang timeout, TimeUnit enhed)
  8. CompletableFuture completeOnTimeout (T-værdi, lang timeout, TimeUnit-enhed)

2.1. Metode defaultExecutor ()

Underskrift: Executor defaultExecutor ()

Returnerer standard Eksekutor bruges til asynkroniseringsmetoder, der ikke angiver et Eksekutor.

ny CompletableFuture (). defaultExecutor ()

Dette kan tilsidesættes af underklasser, der returnerer en eksekutor, der mindst leverer en uafhængig tråd.

2.2. Metode newIncompleteFuture ()

Underskrift: CompletableFuture newIncompleteFuture ()

Det newIncompleteFuture, også kendt som den "virtuelle konstruktør", bruges til at få en ny fremtidig instans af samme type.

new CompletableFuture () newIncompleteFuture ()

Denne metode er især nyttig ved underklassificering Fuldført, hovedsageligt fordi det bruges internt i næsten alle metoder, der returnerer en ny FuldførelseStage, der tillader underklasser at kontrollere, hvilken undertype der returneres ved sådanne metoder.

2.3. Metode kopi()

Underskrift: CompletableFuture kopi ()

Denne metode returnerer en ny Fuldført hvilken:

  • Når dette bliver afsluttet normalt, bliver det nye også afsluttet normalt
  • Når dette undtagelsesvis afsluttes med undtagelse X, afsluttes den nye også undtagelsesvis med en CompletionException med X som årsag
ny CompletableFuture (). kopi ()

Denne metode kan være nyttig som en form for “defensiv kopiering” for at forhindre klienter i at fuldføre, mens de stadig er i stand til at arrangere afhængige handlinger på en bestemt forekomst af Fuldført.

2.4. Metode minimalCompletionStage ()

Underskrift: CompletionStage minimalCompletionStage ()

Denne metode returnerer en ny FuldførelseStage som opfører sig nøjagtigt på samme måde som beskrevet ved kopimetoden, men sådan en ny forekomst kaster Ikke-understøttetOperationException i hvert forsøg på at hente eller indstille den løste værdi.

ny CompletableFuture (). minimalCompletionStage ()

Et nyt Fuldført med alle tilgængelige metoder kan hentes ved hjælp af toCompletableFuture metode tilgængelig på FuldførelseStage API.

2.5. Metoder completeAsync ()

Det completeAsync metoden skal bruges til at fuldføre Fuldført asynkront ved hjælp af den værdi, der er angivet af Leverandør stillet til rådighed.

Underskrifter:

CompletableFuture completeAsync (leverandørleverandør, eksekutor eksekutor) CompletableFuture completeAsync (leverandørleverandør)

Forskellen mellem disse to overbelastede metoder er eksistensen af ​​det andet argument, hvor Eksekutor kørsel af opgaven kan specificeres. Hvis der ikke er angivet nogen, vil standardeksekutøren (returneres af defaultExecutor metode) vil blive brugt.

2.6. Metoder ellerTimeout ()

Underskrift: CompletableFuture ellerTimeout (lang timeout, TimeUnit enhed)

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

Løser Fuldført undtagelsesvis med TimeoutException, medmindre det er afsluttet inden den angivne timeout.

2.7. Metode completeOnTimeout ()

Underskrift: CompletableFuture completeOnTimeout (T-værdi, lang timeout, TimeUnit-enhed)

new CompletableFuture (). completeOnTimeout (værdi, 1, TimeUnit.SECONDS)

Afslutter Fuldført normalt med den angivne værdi, medmindre den er afsluttet inden den angivne timeout.

3. Statiske API-tilføjelser

Nogle hjælpemetoder blev også tilføjet. De er:

  1. Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit enhed, Eksekutor eksekutor)
  2. Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit-enhed)
  3. CompletionStage completedStage (U-værdi)
  4. CompletionStage failedStage (Throwable ex)
  5. CompletableFuture failedFuture (Throwable ex)

3.1. Metoder forsinket eksekutør

Underskrifter:

Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit enhed, Eksekutor eksekutor) Eksekutør forsinket Eksekutør (lang forsinkelse, TimeUnit enhed)

Returnerer et nyt Eksekutor der sender en opgave til den givne basekomputer efter den givne forsinkelse (eller ingen forsinkelse, hvis ikke-positiv). Hver forsinkelse begynder ved påkaldelse af den returnerede eksekutors eksekveringsmetode. Hvis der ikke er angivet nogen eksekutor, er standardekspektøren (ForkJoinPool.commonPool ()) vil blive brugt.

3.2. Metoder fuldførtStage og failedStage

Underskrifter:

 CompletionStage completedStage (U-værdi) CompletionStage failedStage (kastbar ex)

Denne returneringsmetode returneres allerede løst FuldførelseStage forekomster, enten udfyldt normalt med en værdi (fuldførtStage) eller udfyldt undtagelsesvis (failedStage) med den givne undtagelse.

3.3. Metode failedFuture

Underskrift: CompletableFuture failedFuture (Throwable ex)

Den failedFuture-metode tilføjer muligheden for at specificere en allerede udført undtagelsesvis Fuldstændig fremtid eksempel.

4. Eksempel på brugssager

Inden for dette afsnit vil man vise nogle eksempler på, hvordan man bruger noget af det nye API.

4.1. Forsinke

Dette eksempel viser, hvordan man udskyder afslutningen af ​​en Fuldført med en bestemt værdi med et sekund. Dette kan opnås ved hjælp af completeAsync metode sammen med forsinket eksekutør.

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

4.2. Komplet med værdi ved timeout

En anden måde at opnå et forsinket resultat på er at bruge completeOnTimeout metode. Dette eksempel definerer en Fuldført der løses med et givet input, hvis det forbliver uløst efter 1 sekund.

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

4.3. Tiden er gået

En anden mulighed er timingen, som undtagelsesvis løser fremtiden med TimeoutException. For eksempel at have Fuldført timing ud efter 1 sekund, da det ikke er afsluttet før det.

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

5. Konklusion

Afslutningsvis kommer Java 9 med flere tilføjelser til Fuldført API, det har nu bedre understøttelse af underklassificering takket være newIncompleteFuture virtuel konstruktør, er det muligt at tage kontrol over FuldførelseStage tilfælde vendte tilbage i det meste af FuldførelseStage API.

Det har bestemt bedre støtte til forsinkelser og timeouts som vist tidligere. De anvendte hjælpemetoder følger et fornuftigt mønster, der giver Fuldført en praktisk måde at specificere løste forekomster på.

Eksemplerne i denne artikel kan findes i vores GitHub-arkiv.


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