logo

Mikä on CompletableFuture?

A Compltable Future käytetään asynkroniseen ohjelmointiin. Asynkroninen ohjelmointi tarkoittaa ei-estokoodin kirjoittamista. Se suorittaa tehtävän eri säikeessä kuin pääsovellussäie ja ilmoittaa pääsäikeelle sen edistymisestä, valmistumisesta tai epäonnistumisesta.

Tällä tavalla pääsäie ei estä tai odota tehtävän valmistumista. Muut tehtävät suoritetaan rinnakkain. Rinnakkaisuus parantaa ohjelman suorituskykyä.

CompletableFuture on Java-luokka. Se kuuluu java.util.cocurrent-pakettiin. Se toteuttaa CompletionStage- ja Future-käyttöliittymän.

CompletionStage

  • Se suorittaa toiminnon ja palauttaa arvon, kun toinen valmistumisvaihe päättyy.
  • Malli tehtävälle, joka voi laukaista muita tehtäviä.

Siksi se on osa ketjua.

Kun useampi kuin yksi säike yrittää suorittaa loppuun - täydentää poikkeuksellisesti tai peruuttaa CompletableFuture -ohjelman, vain yksi niistä onnistuu.

js monirivinen merkkijono

Tulevaisuus vs. CompletableFuture

CompletableFuture on Java Future API:n laajennus, joka otettiin käyttöön Java 8:ssa.

Futuuria käytetään asynkroniseen ohjelmointiin. Se tarjoaa kaksi menetelmää, isDone() ja get(). Menetelmät hakevat laskennan tuloksen, kun se on valmis.

Tulevaisuuden rajoitukset

  • Tulevaisuus ei voi olla toisiaan täydellinen.
  • Emme voi suorittaa jatkotoimia Futuurin tulokselle ilman estoa.
  • Futurella ei ole poikkeuskäsittelyä.
  • Emme voi yhdistää useita tulevaisuuksia.

Futurella on niin monia rajoituksia, siksi meillä on CompletableFuture. CompletableFuture tarjoaa laajan joukon menetelmiä useiden futuurien luomiseen, ketjuttamiseen ja yhdistämiseen. Siinä on myös kattava poikkeusten käsittelytuki.

Täydellisen tulevaisuuden luominen

Voimme luoda CompletableFuturen vain käyttämällä seuraavaa argumentoimatonta konstruktoria.

 CompletableFuture CompletableFuture = new CompletableFuture(); 

Esimerkki

Yleisimmin käytetyt CompletableFuture-menetelmät ovat:

    supplyAsync():Se suorittaa tehtävänsä asynkronisesti. Toimittajan tuloksen suorittaa oletusarvoisesti tehtävä ForkJoinPool.commonPool(). supplyAsync()-metodi palauttaa CompletableFuturen, johon voimme soveltaa muita menetelmiä.sitten Käytä():Metodi hyväksyy funktion argumentteina. Se palauttaa uuden CompletableStagen, kun tämä vaihe päättyy normaalisti. Uutta vaihetta käytetään toimitetun funktion argumenttina.liittyä seuraan():menetelmä palauttaa tulosarvon, kun se on valmis. Se antaa myös CompletionExceptionin (valitsematon poikkeus), jos se suoritetaan poikkeuksellisesti.
 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; } } 

Lähtö:

CompletableFuture Javassa

CompletableFuturen poikkeuskäsittely

Harkitse seuraavaa kuvaa, joka edustaa viittä CF:tä:

CompletableFuture Javassa

Oletetaan, että viisi CF:tä suorituksessa ja CF21 aiheuttaa poikkeuksen, niin kaikki riippuvat CF:t (CF31 ja CF41) ovat virheellisiä. Se tarkoittaa sitä:

  • IsCompletedExceptionally()-metodin kutsu palauttaa tosi.
  • Kutsu get() heittää ExecutionExceptionin, joka aiheuttaa juuripoikkeuksen.

Tarkastellaan seuraavaa kuvaa, jossa olemme luoneet CF30:n poikkeuksella.

CompletableFuture Javassa

Kun CF21 toimii normaalisti, CF30 vain lähettää arvon. Jos se aiheuttaa poikkeuksen, CF30 käsittelee sen ja luo arvon CF31:lle.

Poikkeuksen käsittelemiseksi on kolme tapaa:

mitä xdxd tarkoittaa
 public CompletableFuture exceptionally(Function function); public CompletableFuture hadle(BiFunction bifunction); public CompletableFuture whenComplete(BiConsumer action);