Java Academy · Oppitunti

CompletableFuture-olioiden luominen ja valmistaminen

Käytä metodeja supplyAsync, runAsync ja completedFuture sekä valmistele future-oliot itse metodeilla complete ja completeExceptionally.

Oppitunti 1/413 vaihetta

CompletableFuture-olioiden luominen ja valmistaminen on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on CompletableFuture?

CompletableFuture<T> (Java 8+) edustaa asynkronista laskentaa, joka voidaan valmistaa, ketjuttaa ja yhdistää eksplisiittisesti. Se toteuttaa sekä Future- että CompletionStage-rajapinnan.

supplyAsync: asynkronisen laskennan käynnistäminen

CompletableFuture.supplyAsync() suorittaa Supplier-toiminnon yhteisessä ForkJoinPoolissa ja palauttaa tuloksen sisältävän futuren.

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // runs on ForkJoinPool.commonPool()
    return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");

runAsync: käynnistä ja unohda

runAsync() suorittaa Runnable-toiminnon asynkronisesti ja palauttaa CompletableFuture<Void>-olion. Käyttäkää sitä, kun ette tarvitse tulosta.

CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
    sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));

Mukautettu Executor

Välittäkää mukautettu Executor hallitaksenne laskennassa käytettävää säiepoolia – tämä on olennaista verkkosovelluksissa, joissa haluatte välttää yhteisen poolin estämistä.

ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
    () -> userService.findById(42L), pool
);

completedFuture: valmiiksi valmistunut arvo

CompletableFuture.completedFuture(value) palauttaa valmiiksi valmistuneen futuren. Se on hyödyllinen testeissä tai silloin, kun teillä on asynkronisessa putkessa heti palautettava arvo.

CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediately

Futuren valmistaminen manuaalisesti

Käyttäkää complete()-metodia tuloksen antamiseen laskennan ulkopuolelta. Käyttäkää completeExceptionally()-metodia virheen ilmoittamiseen.

CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!");       // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get();   // blocks until completed

get() ja join()

Sekä get() että join() estävät suoritusta, kunnes future valmistuu. get() heittää tarkistettavia poikkeuksia, kun taas join() käärii ne tarkistamattomaan CompletionException-poikkeukseen.

try {
    String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)

getNow() estämättömään tarkistukseen

getNow(defaultValue) palauttaa tuloksen, jos future on jo valmistunut, tai annetun oletusarvon, jos se ei ole – kutsu ei estä suoritusta eikä odota.

String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet done

isDone, isCancelled, isCompletedExceptionally

Tarkistakaa futuren tila estämättä suoritusta. Yhdistäkää nämä tarkistukset kyselysilmukoissa tai valvontakoodissa.

if (future.isDone())                    System.out.println("Completed");
if (future.isCancelled())               System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");

cancel() aikakatkaisujen käsittelyyn

Kutsukaa cancel(true) käynnissä olevan laskennan peruuttamiseksi. Future siirtyy peruutettuun tilaan, ja estävä get()-kutsu heittää CancellationException-poikkeuksen.

CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);

completeOnTimeout (Java 9+)

completeOnTimeout(value, timeout, unit) valmistaa futuren automaattisesti oletusarvolla, jos se ei ole valmistunut aikakatkaisun kuluessa – tämä on siistimpi ratkaisu kuin manuaalinen peruutus.

CompletableFuture<String> result = fetchAsync()
    .completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3s

Pikatarkistus

Mikä metodi käynnistää asynkronisen laskennan yhteisessä ForkJoinPoolissa ja palauttaa arvon?

Kertaus

supplyAsync / runAsync käynnistävät asynkronisen työn. complete / completeExceptionally valmistavat futuren manuaalisesti. Käyttäkää join()-metodia tarkistamattomaan estämiseen. completeOnTimeout käsittelee aikakatkaisut siististi.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”CompletableFuture-olioiden luominen ja valmistaminen” ilmainen?

Kyllä – oppitunnin ”CompletableFuture-olioiden luominen ja valmistaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”CompletableFuture-olioiden luominen ja valmistaminen”?

Käytä metodeja supplyAsync, runAsync ja completedFuture sekä valmistele future-oliot itse metodeilla complete ja completeExceptionally. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”CompletableFuture-olioiden luominen ja valmistaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. CompletableFuture-olioiden luominen ja valmistaminen
  2. Ketjutus thenApply- ja thenCompose-metodeilla
  3. Future-olioiden yhdistäminen: allOf ja anyOf
  4. Virheenkäsittely ja asynkroninen HTTP-putki
← Takaisin: Java Academy