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:
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ö:
CompletableFuturen poikkeuskäsittely
Harkitse seuraavaa kuvaa, joka edustaa viittä CF:tä:
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.
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);