logo

Kas ir CompletableFuture?

A CompltableFuture tiek izmantots asinhronai programmēšanai. Asinhronā programmēšana nozīmē nebloķējoša koda rakstīšanu. Tas izpilda uzdevumu atsevišķā pavedienā, nevis galvenajā lietojumprogrammas pavedienā, un paziņo galvenajam pavedienam par tā norisi, pabeigšanu vai kļūmi.

Tādā veidā galvenais pavediens nebloķē un negaida uzdevuma pabeigšanu. Pārējie uzdevumi tiek veikti paralēli. Paralēlisms uzlabo programmas veiktspēju.

CompletableFuture ir Java klase. Tas pieder java.util.cocurrent pakotnei. Tas ievieš CompletionStage un Future interfeisu.

Pabeigšanas posms

  • Tas veic darbību un atgriež vērtību, kad tiek pabeigts cits pabeigšanas posms.
  • Modelis uzdevumam, kas var izraisīt citus uzdevumus.

Tādējādi tas ir ķēdes elements.

Ja tiek mēģināts pabeigt vairāk nekā vienu pavedienu — pabeigt izņēmuma kārtā vai atcelt CompletableFuture, tikai viens no tiem izdodas.

windows.open javascript

Nākotne vs CompletableFuture

CompletableFuture ir Java Future API paplašinājums, kas tika ieviests Java 8.

Nākotne tiek izmantota asinhronai programmēšanai. Tas nodrošina divas metodes: isDone() un get(). Metodes izgūst aprēķina rezultātu, kad tas ir pabeigts.

Nākotnes ierobežojumi

  • Nākotne nevar būt savstarpēji pilnīga.
  • Mēs nevaram veikt turpmākas darbības ar nākotnes rezultātu bez bloķēšanas.
  • Nākotnē nav nekādu izņēmumu apstrādes.
  • Mēs nevaram apvienot vairākas nākotnes iespējas.

Nākotnei ir tik daudz ierobežojumu, tāpēc mums ir CompletableFuture. CompletableFuture nodrošina plašu metožu kopumu vairāku nākotnes līgumu izveidei, ķēdes savienošanai un apvienošanai. Tam ir arī visaptverošs izņēmumu apstrādes atbalsts.

Pilnīgas nākotnes izveide

Mēs varam izveidot CompletableFuture, tikai izmantojot šādu bezargumentu konstruktoru.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Piemērs

Visbiežāk izmantotās CompletableFuture metodes ir:

    supplyAsync():Tas pabeidz savu darbu asinhroni. Piegādātāja rezultātu kā noklusējuma izpilda uzdevums no ForkJoinPool.commonPool(). Metode supplyAsync() atgriež CompletableFuture, kurā mēs varam izmantot citas metodes.tad Pieteikties ():Metode pieņem funkciju kā argumentu. Tas atgriež jaunu CompletableStage, kad šis posms tiek pabeigts normāli. Jaunais posms tiek izmantots kā arguments nodrošinātajai funkcijai.pievienoties ():metode atgriež rezultāta vērtību, kad tā ir pabeigta. Tas arī rada CompletionException (neatzīmēts izņēmums), ja tas tiek izpildīts izņēmuma kārtā.
 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; } } 

Izvade:

poga, lai centrētu css
CompletableFuture Java

CompletableFuture izņēmuma apstrāde

Apsveriet šādu attēlu, kas attēlo piecus CF:

CompletableFuture Java

Pieņemsim, ka tiek izpildīti pieci CF un CF21 rada izņēmumu, tad visi atkarīgie CF (CF31 un CF41) ir kļūdaini. Tas nozīmē, ka:

  • Metodes isCompletedExceptionally() izsaukums atgriež true.
  • Izsaukums get() izsauc ExecutionException, kas izraisa saknes izņēmumu.

Apsveriet šādu attēlu, kurā esam izveidojuši CF30 ar izņēmumu.

CompletableFuture Java

Kad CF21 darbojas normāli, CF30 tikai pārsūta vērtību. Ja tas rada izņēmumu, CF30 to apstrādā un ģenerē vērtību CF31.

Ir trīs veidi, kā rīkoties ar izņēmumu:

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