A CompltableFuture naudojamas asinchroniniam programavimui. Asinchroninis programavimas reiškia neblokuojančio kodo rašymą. Ji vykdo užduotį atskiroje gijoje nei pagrindinė programos gija ir praneša pagrindinei gijai apie jos eigą, užbaigimą arba nesėkmę.
Tokiu būdu pagrindinė gija neužblokuoja ir nelaukia, kol bus atlikta užduotis. Kitos užduotys vykdomos lygiagrečiai. Lygiagretumas pagerina programos veikimą.
„A CompletableFuture“ yra „Java“ klasė. Jis priklauso java.util.cocurrent paketui. Tai įgyvendina „CompletionStage“ ir „Future“ sąsają.
Užbaigimo etapas
- Jis atlieka veiksmą ir grąžina vertę, kai baigiasi kitas užbaigimo etapas.
- Užduoties, kuri gali sukelti kitas užduotis, modelis.
Vadinasi, tai yra grandinės elementas.
Kai bandoma užbaigti daugiau nei vieną giją – išskirtinai užbaigti arba atšaukti CompletableFuture, tik vienai iš jų pavyksta.
base64 javascript dekodavimas
Ateitis vs CompletableFuture
„A CompletableFuture“ yra „Java“ ateities API plėtinys, kuris buvo pristatytas „Java 8“.
Ateitis naudojama asinchroniniam programavimui. Jame pateikiami du metodai: isDone () ir get (). Metodai nuskaito skaičiavimo rezultatą, kai jis baigtas.
Ateities apribojimai
- Ateitis negali būti abipusiai užbaigta.
- Negalime atlikti tolesnių veiksmų su Ateities rezultatu be blokavimo.
- Ateitis neturi jokių išimčių tvarkymo.
- Negalime sujungti kelių ateities.
Ateitis turi tiek daug apribojimų, todėl turime CompletableFuture. „CompletableFuture“ siūlo platų kelių ateities sandorių kūrimo, sujungimo ir derinimo metodų rinkinį. Ji taip pat turi visapusišką išimčių tvarkymo palaikymą.
Užbaigtos ateities kūrimas
Mes galime sukurti CompletableFuture tik naudodami šį beargumentinį konstruktorių.
CompletableFuture CompletableFuture = new CompletableFuture();
Pavyzdys
Dažniausiai naudojami CompletableFuture metodai:
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; } }
Išvestis:
Išimtis „CompletableFuture“ tvarkymas
Apsvarstykite šį paveikslą, kuriame pavaizduoti penki CF:
Tarkime, kad vykdomi penki CF ir CF21 iškelia išimtį, tada visi priklausomi CF (CF31 ir CF41) yra klaidingi. Tai reiškia kad:
- Metodo isCompletedExceptionally() iškvietimas grąžina true.
- Kvietimas gauti() išmeta ExecutionException, kuri sukelia šakninę išimtį.
Apsvarstykite toliau pateiktą paveikslą, kuriame sukūrėme CF30 su išimtimi.
Kai CF21 veikia įprastai, tada CF30 tiesiog perduoda reikšmę. Jei ji iškelia išimtį, CF30 ją tvarko ir sukuria CF31 vertę.
Yra trys būdai, kaip elgtis su išimtimi:
stygų skaidymas c++
public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);