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:
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 izņēmuma apstrāde
Apsveriet šādu attēlu, kas attēlo piecus CF:
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.
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);