logo

Kas yra CompletableFuture?

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:

    supplyAsync():Jis atlieka savo darbą asinchroniškai. Tiekėjo rezultatas vykdomas pagal užduotį iš ForkJoinPool.commonPool() kaip numatytąjį. Metodas supplyAsync() grąžina CompletableFuture, kurioje galime taikyti kitus metodus.tada Taikyti ():Metodas priima funkciją kaip argumentą. Jis grąžina naują CompletableStage, kai šis etapas baigiasi įprastai. Naujas etapas naudojamas kaip pateiktos funkcijos argumentas.prisijungti ():užbaigtas metodas grąžina rezultato reikšmę. Ji taip pat pateikia CompletionException (nepažymėta išimtis), jei ji baigta išskirtinai.
 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:

CompletableFuture Java

Išimtis „CompletableFuture“ tvarkymas

Apsvarstykite šį paveikslą, kuriame pavaizduoti penki CF:

CompletableFuture Java

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.

CompletableFuture Java

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);