Vylepšenia rozhrania Java 9 CompletableFuture API

1. Úvod

Java 9 prichádza s niekoľkými zmenami v CompletableFuture trieda. Takéto zmeny boli zavedené ako súčasť JEP 266 s cieľom riešiť bežné sťažnosti a návrhy od jeho zavedenia v JDK 8, konkrétnejšie podpora oneskorení a časových limitov, lepšia podpora podtriedy a niekoľko užitočných metód.

Po kódovej stránke prichádza API s ôsmimi novými metódami a piatimi novými statickými metódami. Aby bolo možné tieto dodatky povoliť, bolo zmenených približne 1 500 z 2 400 riadkov kódu (podľa Open JDK).

2. Dodatky rozhrania API inštancie

Ako už bolo spomenuté, inštančné API prichádza s ôsmimi novými prírastkami, ktorými sú:

  1. Vykonávateľ defaultExecutor ()
  2. CompletableFuture newIncompleteFuture ()
  3. CompletableFuture copy ()
  4. CompletionStage minimalCompletionStage ()
  5. CompletableFuture completeAsync (dodávateľ dodávateľa, exekútor vykonávateľ)
  6. CompletableFuture completeAsync (dodávateľ dodávateľa)
  7. CompletableFuture aleboTimeout (dlhý časový limit, jednotka TimeUnit)
  8. CompletableFuture completeOnTimeout (hodnota T, dlhý časový limit, jednotka TimeUnit)

2.1. Metóda defaultExecutor ()

Podpis: Vykonávateľ defaultExecutor ()

Vráti predvolenú hodnotu Exekútor používa sa pre asynchronné metódy, ktoré nešpecifikujú Exekútor.

nový CompletableFuture (). defaultExecutor ()

To je možné prepísať podtriedami vracajúcimi exekútor, ktorý poskytuje aspoň jedno nezávislé vlákno.

2.2. Metóda newIncompleteFuture ()

Podpis: CompletableFuture newIncompleteFuture ()

The newIncompleteFuture, známy tiež ako „virtuálny konštruktor“, sa používa na získanie novej dokončiteľnej budúcej inštancie rovnakého typu.

new CompletableFuture (). newIncompleteFuture ()

Táto metóda je obzvlášť užitočná pri podtriede CompletableFuture, hlavne preto, že sa interne používa takmer vo všetkých metódach vracajúcich nový DokončenieStage, čo umožňuje podtriedam riadiť, aký podtyp sa vráti takýmito metódami.

2.3. Metóda copy ()

Podpis: CompletableFuture copy ()

Táto metóda vráti nový CompletableFuture ktoré:

  • Keď sa to normálne dokončí, nové sa dokončí tiež normálne
  • Keď sa to výnimočne dokončí s výnimkou X, nový sa tiež výnimočne doplní a Dokončenie výnimky s X ako príčina
nový CompletableFuture (). copy ()

Táto metóda môže byť užitočná ako forma „obranného kopírovania“, ktorá zabráni klientom v dokončení, zatiaľ čo bude stále schopná zariadiť závislé akcie na konkrétnej inštancii CompletableFuture.

2.4. Metóda minimalCompletionStage ()

Podpis: CompletionStage minimalCompletionStage ()

Táto metóda vráti nový DokončenieStage ktorý sa chová úplne rovnako, ako to bolo popísané metódou copy, ale taká nová inštancia hodí UnsupportedOperationException pri každom pokuse o načítanie alebo nastavenie vyriešenej hodnoty.

nový CompletableFuture (). minimalCompletionStage ()

Nový CompletableFuture so všetkými dostupnými metódami je možné vyhľadať pomocou toCompletableFuture metóda dostupná na internete DokončenieStage API.

2.5. Metódy completeAsync ()

The completeAsync mala by sa použiť metóda na dokončenie CompletableFuture asynchrónne pomocou hodnoty danej parametrom Dodávateľ za predpokladu.

Podpisy:

CompletableFuture completeAsync (dodávateľ dodávateľa, vykonávateľ exekúcie) CompletableFuture completeAsync (dodávateľ dodávateľa)

Rozdiel medzi týmito dvoma preťaženými metódami je v existencii druhého argumentu, kde Exekútor je možné určiť spustenie úlohy. Ak nie je uvedený žiadny, predvolený exekútor (vrátený defaultExecutor metóda).

2.6. Metódy orTimeout ()

Podpis: CompletableFuture aleboTimeout (dlhý časový limit, jednotka TimeUnit)

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

Rieši CompletableFuture výnimočne s Výnimka časového limitu, pokiaľ nie je dokončená pred stanoveným časovým limitom.

2.7. Metóda completeOnTimeout ()

Podpis: CompletableFuture completeOnTimeout (hodnota T, dlhý časový limit, jednotka TimeUnit)

nové CompletableFuture (). completeOnTimeout (hodnota, 1, TimeUnit.SECONDS)

Dokončuje CompletableFuture normálne so zadanou hodnotou, pokiaľ nie je dokončená pred stanoveným časovým limitom.

3. Prírastky statického API

Boli tiež pridané niektoré užitočné metódy. Oni sú:

  1. Exekútor oneskorený Exekútor (dlhé oneskorenie, jednotka TimeUnit, exekútor exekútor)
  2. Exekútor oneskorený Exekútor (dlhé oneskorenie, jednotka TimeUnit)
  3. CompletionStage completedStage (hodnota U)
  4. CompletionStage failedStage (hoditeľný ex)
  5. CompletableFuture failedFuture (hoditeľný ex)

3.1. Metódy oneskorený Exekútor

Podpisy:

Exekútor delayedExecutor (dlhé oneskorenie, jednotka TimeUnit, exekútor exekútor) Exekútor delayedExecutor (dlhé oneskorenie, jednotka TimeUnit)

Vráti nový Exekútor ktorý zadá úlohu danému základnému exekútorovi po danom oneskorení (alebo bez oneskorenia, ak nie je kladné). Každé oneskorenie sa začína pri vyvolaní vrátenej metódy vykonania exekútora. Ak nie je zadaný žiadny exekútor, predvolený exekútor (ForkJoinPool.commonPool ()) bude použitý.

3.2. Metódy CompleteStage a failedStage

Podpisy:

 CompletionStage CompleteStage (hodnota U) CompletionStage failedStage (hoditeľný ex)

Tento spôsob obsluhy vráti už vyriešený DokončenieStage inštancie, buď normálne vyplnené hodnotou (CompleteStage) alebo dokončené výnimočne (failedStage) s uvedenou výnimkou.

3.3. Metóda failedFuture

Podpis: CompletableFuture failedFuture (hoditeľný ex)

Metóda failedFuture pridáva možnosť výnimočne špecifikovať už dokončené CompleatebleFuture inštancia.

4. Príklady použitia

V tejto časti si ukážeme niekoľko príkladov, ako používať niektoré nové API.

4.1. Oneskorenie

Tento príklad ukáže, ako oddialiť dokončenie a CompletableFuture so špecifickou hodnotou o jednu sekundu. To sa dá dosiahnuť použitím completeAsync metóda spolu s oneskorený Exekútor.

CompletableFuture future = nový CompletableFuture (); future.completeAsync (() -> vstup, CompletableFuture.delayedExecutor (1, TimeUnit.SECONDS));

4.2. Kompletné s hodnotou na časový limit

Ďalším spôsobom, ako dosiahnuť oneskorený výsledok, je použitie completeOnTimeout metóda. Tento príklad definuje a CompletableFuture ktoré budú vyriešené s daným vstupom, ak zostane nevyriešené po 1 sekunde.

CompletableFuture future = nový CompletableFuture (); future.completeOnTimeout (vstup, 1, TimeUnit.SECONDS);

4.3. Čas vypršal

Ďalšou možnosťou je načasovanie, pri ktorom sa výnimočne rieši budúcnosť Výnimka časového limitu. Napríklad mať CompletableFuture časový limit po 1 sekunde nie je dokončený skôr.

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

5. Záver

Na záver možno povedať, že Java 9 prichádza s niekoľkými doplnkami k CompletableFuture API má teraz lepšiu podporu pre podtriedy vďaka newIncompleteFuture virtuálny konštruktor, je možné prevziať kontrolu nad DokončenieStage inštancie vrátené vo väčšine DokončenieStage API.

Rozhodne má lepšiu podporu pre oneskorenia a časové limity, ako je uvedené vyššie. Pridané úžitkové metódy sa riadia rozumným vzorom CompletableFuture pohodlný spôsob, ako určiť vyriešené inštancie.

Príklady použité v tomto článku nájdete v našom úložisku GitHub.


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