Java 9 CompletableFuture API fejlesztések

1. Bemutatkozás

A Java 9 néhány változtatást tartalmaz a CompletableFuture osztály. Ilyen változtatásokat a JEP 266 részeként vezettek be annak érdekében, hogy kezeljék a JDK-ban való bevezetése óta elterjedt panaszokat és javaslatokat, pontosabban a késések és az időkorlátok támogatását, az alosztályok jobb támogatását és néhány hasznos módszert.

Kód szerint az API nyolc új módszerrel és öt új statikus módszerrel érkezik. Az ilyen kiegészítések engedélyezéséhez a 2400 kódsorból hozzávetőlegesen 1500 módosult (az Open JDK szerint).

2. Példány API-kiegészítések

Mint említettük, a példány API nyolc új kiegészítéssel érkezik, ezek:

  1. Executor defaultExecutor ()
  2. CompletableFuture newIncompleteFuture ()
  3. CompletableFuture copy ()
  4. CompletionStage minimalCompletionStage ()
  5. CompletableFuture completeAsync (beszállítói beszállító, végrehajtó végrehajtó)
  6. CompletableFuture completeAsync (beszállítói szállító)
  7. CompletableFuture orTimeout (hosszú időtúllépés, TimeUnit egység)
  8. CompletableFuture completeOnTimeout (T érték, hosszú időtúllépés, TimeUnit egység)

2.1. Módszer defaultExecutor ()

Aláírás: Executor defaultExecutor ()

Visszaadja az alapértelmezett értéket Végrehajtó olyan aszinkron módszerekhez használják, amelyek nem adnak meg egy Végrehajtó.

új CompletableFuture (). defaultExecutor ()

Ezt felülírhatja az alosztályok visszaküldése egy végrehajtónak, amely legalább egy független szálat biztosít.

2.2. Módszer newIncompleteFuture ()

Aláírás: CompletableFuture newIncompleteFuture ()

A newIncompleteFuture, más néven „virtuális konstruktor”, egy új, befejezhető, azonos típusú jövőbeli példány megszerzésére szolgál.

new CompletableFuture (). newIncompleteFuture ()

Ez a módszer különösen hasznos alosztályoknál CompletableFuture, főleg azért, mert szinte minden módszerben belsőleg használják, és új eredményt adnak vissza CompletionStage, lehetővé téve az alosztályok számára, hogy ellenőrizzék, milyen altípust kapnak vissza az ilyen módszerek.

2.3. Módszer másolat()

Aláírás: CompletableFuture copy ()

Ez a módszer újat ad vissza CompletableFuture melyik:

  • Amikor ez normálisan elkészül, akkor az új is normálisan elkészül
  • Amikor ez kivételesen, az X kivétellel befejeződik, az új is kivételesen kitöltésre kerül az a-val CompletionException X-gyel okként
új CompletableFuture (). copy ()

Ez a módszer hasznos lehet a „védekező másolás” egyik formájaként, hogy megakadályozza az ügyfeleket a befejezésben, miközben továbbra is képesek függő műveleteket elrendezni egy adott CompletableFuture.

2.4. Módszer minimalCompletionStage ()

Aláírás: CompletionStage minimalCompletionStage ()

Ez a módszer újat ad vissza CompletionStage amely pontosan ugyanúgy viselkedik, mint amit a másolási módszer leír, azonban az ilyen új példányok dobják UnsupportedOperationException minden kísérletben megkeresni vagy beállítani a megoldott értéket.

új CompletableFuture (). minimalCompletionStage ()

Egy új CompletableFuture az összes rendelkezésre álló módszerrel a toCompletableFuture módszer elérhető a CompletionStage API.

2.5. Mód completeAsync ()

A completeAsync módszert kell használni a CompletableFuture aszinkron módon a Támogató biztosítani.

Aláírások:

CompletableFuture completeAsync (Beszállító szállító, Executor végrehajtó) CompletableFuture CompleteAsync (Beszállító beszállító)

E két túlterhelt módszer közötti különbség a második érv megléte, ahol a Végrehajtó a feladat futtatása megadható. Ha nincs megadva, akkor az alapértelmezett végrehajtó (a defaultExecutor módszer) kerül alkalmazásra.

2.6. Mód vagyTimeout ()

Aláírás: CompletableFuture orTimeout (hosszú időtúllépés, TimeUnit egység)

új CompletableFuture (). vagy Timeout (1, TimeUnit.SECONDS)

Megoldja a CompletableFuture kivételesen azzal TimeoutException, hacsak nem fejeződik be a megadott időtúllépés előtt.

2.7. Módszer completeOnTimeout ()

Aláírás: CompletableFuture completeOnTimeout (T érték, hosszú időtúllépés, TimeUnit egység)

új CompletableFuture (). completeOnTimeout (érték, 1, TimeUnit.SECONDS)

Befejezi a CompletableFuture általában a megadott értékkel, hacsak nem fejeződik be a megadott időtúllépés előtt.

3. Statikus API-kiegészítések

Néhány segédprogramot is hozzáadtak. Ők:

  1. Végrehajtó késleltetett
  2. Végrehajtó késleltetett Végrehajtó (hosszú késleltetés, TimeUnit egység)
  3. CompletionStage completeStage (U érték)
  4. CompletionStage FailStage (Throwable ex)
  5. CompletableFuture sikertelen Future (Throwable ex)

3.1. Mód delayedExecutor

Aláírások:

Végrehajtó késleltetett Végrehajtó (hosszú késleltetés, TimeUnit egység, Végrehajtó végrehajtó) Végrehajtó késleltetett végrehajtó (hosszú késés, TimeUnit egység)

Új értéket ad vissza Végrehajtó amely feladatot nyújt be az adott bázis végrehajtónak a megadott késedelem után (vagy ha nincs pozitív késleltetés). Minden késés a visszaküldött végrehajtó végrehajtási metódusának meghívásával kezdődik. Ha nincs végrehajtó megadva, akkor az alapértelmezett végrehajtó (ForkJoinPool.commonPool ()) használva lesz.

3.2. Mód completeStage és FailStage

Aláírások:

 CompletionStage completeStage (U érték) CompletionStage sikertelenStage (Throwable ex)

Ez a segédprogram metódusai már megoldottak CompletionStage vagy normálisan kitöltve egy értékkel (completeStage) vagy kivételesen kitöltve (FailStage) az adott kivétellel.

3.3. Módszer FailFuture

Aláírás: CompletableFuture sikertelen Future (Throwable ex)

A FailFuture metódus hozzáadja a már elkészült kivételes megadásának lehetőségét CompleatebleFuture példa.

4. Példa használati esetekre

Ebben a szakaszban bemutatunk néhány példát az új API használatának néhány módjára.

4.1. Késleltetés

Ez a példa megmutatja, hogyan lehet késleltetni a CompletableFuture meghatározott értékkel egy másodperccel. Ezt a completeAsync módszer az delayedExecutor.

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

4.2. A Timeout értékkel kiegészítve

A késleltetett eredmény elérésének másik módja a completeOnTimeout módszer. Ez a példa meghatározza a CompletableFuture ami egy adott bemenettel megoldódik, ha 1 másodperc után megoldatlan marad.

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

4.3. Időtúllépés

Egy másik lehetőség az időzítés, amely kivételesen megoldja a jövőt TimeoutException. Például az CompletableFuture időzítés 1 másodperc múlva, mivel ez még nem fejeződött be.

CompletableFuture future = new CompletableFuture (); jövő.vagyTimeout (1, TimeUnit.SECONDS);

5. Következtetés

Összegzésként elmondható, hogy a Java 9 számos kiegészítést tartalmaz a CompletableFuture API, most már jobban támogatja az alosztályokat, a newIncompleteFuture virtuális konstruktor, akkor lehetséges, hogy átvegye az irányítást a CompletionStage példányok visszatértek a legtöbb CompletionStage API.

Határozottan jobban támogatja a késéseket és az időkorlátokat, amint azt korábban bemutattuk. A hozzáadott hasznossági módszerek ésszerű mintát követnek, adva CompletableFuture kényelmes megoldás a megoldott példányok megadására.

A cikkben használt példák megtalálhatók a GitHub-adattárunkban.