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:
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:
Obravnava izjem CompletableFuture
Razmislite o naslednji sliki, ki predstavlja pet CF-jev:
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
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);