logo

Kaj je CompletableFuture?

A CompltableFuture se uporablja za asinhrono programiranje. Asinhrono programiranje pomeni pisanje neblokirne kode. Zažene nalogo v ločeni niti kot glavna nit aplikacije in obvesti glavno nit o njenem napredku, zaključku ali neuspehu.

Na ta način glavna nit ne blokira ali čaka na dokončanje naloge. Druge naloge se izvajajo vzporedno. Paralelizem izboljša delovanje programa.

CompletableFuture je razred v Javi. Spada v paket java.util.cocurrent. Izvaja vmesnik CompletionStage in Future.

CompletionStage

  • Izvede dejanje in vrne vrednost, ko se zaključi druga stopnja dokončanja.
  • Model za nalogo, ki lahko sproži druge naloge.

Zato je element verige.

Ko več kot ena nit poskuša dokončati – dokončati izredno ali preklicati CompletableFuture, uspe samo ena izmed njih.

abstraktni razred v Javi

Prihodnost proti CompletableFuture

CompletableFuture je razširitev vmesnika Java Future API, ki je bil predstavljen v Javi 8.

Prihodnost se uporablja za asinhrono programiranje. Ponuja dve metodi, isDone() in get(). Metode pridobijo rezultat izračuna, ko je ta končan.

Omejitve prihodnosti

  • Prihodnost ne more biti vzajemno popolna.
  • Brez blokiranja ne moremo izvesti nadaljnjega dejanja na rezultatu Future.
  • Prihodnost nima obravnave izjem.
  • Ne moremo združiti več prihodnosti.

Prihodnost ima toliko omejitev, zato imamo CompletableFuture. CompletableFuture ponuja širok nabor metod za ustvarjanje več terminskih poslov, veriženje in združevanje. Ima tudi celovito podporo za obravnavanje izjem.

Ustvarjanje CompletableFuture

CompletableFuture lahko ustvarimo le z uporabo naslednjega konstruktorja brez argumentov.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Primer

Najpogosteje uporabljene metode CompletableFuture so:

    supplyAsync():Svoje delo opravi asinhrono. Rezultat dobavitelja privzeto izvaja naloga iz ForkJoinPool.commonPool(). Metoda supplyAsync() vrne CompletableFuture, na kateri lahko uporabimo druge metode.nato Uporabi():Metoda sprejme funkcijo kot argument. Ko se ta stopnja normalno zaključi, vrne novo CompletableStage. Nova stopnja se uporablja kot argument za posredovano funkcijo.pridruži se():metoda vrne vrednost rezultata, ko je dokončana. Prav tako vrže CompletionException (nepreverjena izjema), če je dokončana izjemno.
 import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; public class CompletableFutureExample1 { public static void main(String[] args) { try { List list = Arrays.asList(5,9,14); list.stream().map(num->CompletableFuture.supplyAsync(()->getNumber(num))).map(CompletableFuture->CompletableFuture.thenApply(n- >n*n)).map(t->t.join()).forEach(s->System.out.println(s)); } catch (Exception e) { e.printStackTrace(); } } private static int getNumber(int a) { return a*a; } } 

Izhod:

CompletableFuture v Javi

Obravnava izjem CompletableFuture

Razmislite o naslednji sliki, ki predstavlja pet CF-jev:

CompletableFuture v Javi

Recimo, da se izvaja pet CF-jev in CF21 sproži izjemo, potem so vsi odvisni CF-ji (CF31 in CF41) v napaki. To pomeni, da:

  • Klic metode isCompletedExceptionly() vrne true.
  • Klic get() vrže ExecutionException, ki povzroči korensko izjemo.

Razmislite o naslednji sliki, na kateri smo z izjemo ustvarili CF30.

hadoop vadnica
CompletableFuture v Javi

Ko se CF21 izvaja normalno, potem CF30 le posreduje vrednost. Če sproži izjemo, jo CF30 obravnava in ustvari vrednost za CF31.

Obstajajo trije načini za obravnavo izjeme:

 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);