Poboljšanja API-ja Java 9 CompletableFuture

1. Uvod

Java 9 dolazi s nekim promjenama na CompletableFuture razred. Takve su promjene uvedene kao dio JEP-a 266 radi rješavanja uobičajenih žalbi i prijedloga od njegovog uvođenja u JDK 8, točnije, podrške za kašnjenja i vremenska ograničenja, bolje podrške za podrazvrstavanje i nekoliko korisnih metoda.

Šifrirano, API dolazi s osam novih metoda i pet novih statičkih metoda. Da bi se omogućili takvi dodaci, promijenjeno je približno 1500 od 2400 redaka koda (prema Open JDK).

2. Dodaci API-ja instance

Kao što je spomenuto, API instance dolazi s osam novih dodataka, a to su:

  1. Izvršitelj defaultExecutor ()
  2. CompletableFuture newIncompleteFuture ()
  3. Kompletna buduća kopija ()
  4. CompletionStage minimalCompletionStage ()
  5. CompletableFuture completeAsync (dobavljač dobavljača, izvršitelj izvršitelja)
  6. CompletableFuture completeAsync (dobavljač dobavljač)
  7. CompletableFuture iliTimeout (dugo vrijeme čekanja, jedinica vremenske jedinice)
  8. CompletableFuture completeOnTimeout (vrijednost T, dugo vremensko ograničenje, jedinica vremenske jedinice)

2.1. Metoda zadani izvršilac ()

Potpis: Izvršitelj defaultExecutor ()

Vraća zadanu vrijednost Izvršitelj koristi se za async metode koje ne navode Izvršitelj.

novi CompletableFuture (). defaultExecutor ()

To se može nadjačati potklasama koje vraćaju izvršitelja koji pruža barem jednu neovisnu nit.

2.2. Metoda newIncompleteFuture ()

Potpis: CompletableFuture newIncompleteFuture ()

The newIncompleteFuture, također poznat kao "virtualni konstruktor", koristi se za dobivanje nove dovršive buduće instance istog tipa.

new CompletableFuture (). newIncompleteFuture ()

Ova je metoda posebno korisna pri potklasiranju CompletableFuture, uglavnom zato što se interno koristi u gotovo svim metodama vraćanja novih CompletionStage, dopuštajući potklasama da kontroliraju koji se podtip vraća takvim metodama.

2.3. Metoda kopirati()

Potpis: Kompletna buduća kopija ()

Ova metoda vraća novu CompletableFuture koji:

  • Kada se ovo normalno završi, normalno se završava i novo
  • Kada se ovo iznimno dovrši s iznimkom X, novo se također dovršava iznimno s CompletionException s X kao uzrokom
novi CompletableFuture (). copy ()

Ova metoda može biti korisna kao oblik "obrambenog kopiranja", kako bi se spriječilo da klijenti dovrše, dok još uvijek mogu organizirati ovisne radnje na određenoj instanci CompletableFuture.

2.4. Metoda minimalCompletionStage ()

Potpis: CompletionStage minimalCompletionStage ()

Ova metoda vraća novu CompletionStage koji se ponaša na potpuno isti način kao što je opisano metodom kopiranja, međutim, takva nova instanca baca UnsupportedOperationException u svakom pokušaju dohvaćanja ili postavljanja razriješene vrijednosti.

novi CompletableFuture (). minimalCompletionStage ()

Nova CompletableFuture sa svim dostupnim metodama može se doći pomoću doCompletableFuture metoda dostupna na CompletionStage API.

2.5. Metode completeAsync ()

The completeAsync metodu treba upotrijebiti za dovršetak CompletableFuture asinhrono koristeći vrijednost koju daje Dobavljač pod uvjetom.

Potpisi:

CompletableFuture completeAsync (dobavljač dobavljač, izvršitelj izvršitelja) CompletableFuture completeAsync (dobavljač dobavljača)

Razlika između ove dvije preopterećene metode je postojanje drugog argumenta, gdje Izvršitelj pokretanje zadatka može se navesti. Ako se ništa ne navede, zadani izvršitelj (vratio zadaniIzvršitelj metoda) će se koristiti.

2.6. Metode iliTimeout ()

Potpis: CompletableFuture iliTimeout (dugo vrijeme čekanja, jedinica vremenske jedinice)

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

Rješava CompletableFuture iznimno sa TimeoutException, osim ako nije dovršeno prije određenog vremenskog ograničenja.

2.7. Metoda completeOnTimeout ()

Potpis: CompletableFuture completeOnTimeout (vrijednost T, dugo vremensko ograničenje, jedinica vremenske jedinice)

novi CompletableFuture (). completeOnTimeout (vrijednost, 1, TimeUnit.SECONDS)

Dovršava CompletableFuture obično s navedenom vrijednošću, osim ako nije dovršena prije određenog vremenskog ograničenja.

3. Statički dodaci API-ja

Dodane su i neke korisne metode. Oni su:

  1. Izvršitelj odgođenIzvršitelj (dugo kašnjenje, jedinica vremenske jedinice, izvršitelj izvršitelja)
  2. Izvršitelj odgođen Izvršitelj (dugo kašnjenje, jedinica vremenske jedinice)
  3. CompletionStage CompleteStage (U vrijednost)
  4. CompletionStage failedStage (Mogućnost bacanja ex)
  5. CompletableFuture failedFuture (Može se baciti ex)

3.1. Metode odgođeniIzvršitelj

Potpisi:

Izvršitelj odgođenIzvršitelj (dugo kašnjenje, jedinica vremenske jedinice, izvršitelj izvršitelj) Izvršitelj odgođen izvršitelj (dugo kašnjenje, jedinica vremenske jedinice)

Vraća novo Izvršitelj koja predaje zadatak zadanom izvršitelju baze nakon zadanog kašnjenja (ili nema odgode ako nije pozitivna). Svaka odgoda započinje pozivanjem metode izvršenja vraćenog izvršitelja. Ako nije naveden nijedan izvršitelj zadani izvršitelj (ForkJoinPool.commonPool ()) će se koristiti.

3.2. Metode CompleteStage i failedStage

Potpisi:

 CompletionStage completedStage (U vrijednost) CompletionStage failedStage (Dopušteno ex)

Ove korisne metode vraćaju već riješene CompletionStage primjerke, ili se normalno popunjavaju vrijednošću (CompleteStage) ili dovršeno izuzetno (failedStage) uz zadanu iznimku.

3.3. Metoda nije uspjelo u budućnosti

Potpis: CompletableFuture failedFuture (Može se baciti ex)

Metoda failedFuture dodaje mogućnost specificiranja već dovršenog izuzetno CompleatebleFuture primjer.

4. Primjeri slučajeva korištenja

Unutar ovog odjeljka prikazat će se neki primjeri kako se koristi neki od novih API-ja.

4.1. Odgoditi

Ovaj će primjer pokazati kako odgoditi završetak a CompletableFuture s određenom vrijednošću za jednu sekundu. To se može postići korištenjem completeAsync metoda zajedno s odgođeniIzvršitelj.

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

4.2. Komplet s vrijednošću vremenskog ograničenja

Drugi način postizanja odgođenog rezultata je upotreba completeOnTimeout metoda. Ovaj primjer definira a CompletableFuture to će se riješiti zadanim unosom ako ostane neriješeno nakon 1 sekunde.

CompletableFuture future = novo CompletableFuture (); future.completeOnTimeout (ulaz, 1, TimeUnit.SECONDS);

4.3. Pauza

Druga mogućnost je vremensko ograničenje koje iznimno rješava budućnost TimeoutException. Na primjer, imati CompletableFuture isteklo vrijeme nakon 1 sekunde s obzirom da prije toga nije dovršeno.

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

5. Zaključak

Zaključno, Java 9 dolazi s nekoliko dodataka za CompletableFuture API, sada ima bolju podršku za potklasiranje, zahvaljujući newIncompleteFuture virtualni konstruktor, moguće je preuzeti kontrolu nad CompletionStage slučajevi vraćeni u većini slučajeva CompletionStage API.

Definitivno ima bolju podršku za kašnjenja i istek vremena kako je prethodno prikazano. Dodane korisne metode slijede razuman obrazac, davanje CompletableFuture prikladan način za navođenje riješenih instanci.

Primjeri korišteni u ovom članku mogu se naći u našem GitHub spremištu.