Asynkroniset pyynnöt
sendAsync ja CompletableFuture.
Asynkroniset pyynnöt on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/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.
Asynkroniset pyynnöt
Jokaisen HTTP-kutsun suorittaminen estävästi tuhlaa säikeitä. JDK:n HTTP-asiakas tarjoaa sendAsync-metodin, joka palauttaa CompletableFuture-olion välittömästi ja suorittaa työn taustalla olevassa suorittajassa.
Näin voitte käynnistää useita pyyntöjä samanaikaisesti ja yhdistellä niiden tuloksia hallitsematta säikeitä itse.
send vs sendAsync
Metodien palautusarvot eroavat toisistaan:
- send palauttaa
HttpResponse<T>-olion ja estää suorituksen sekä ilmoittaa poikkeuksetIOExceptionjaInterruptedException. - sendAsync palauttaa
CompletableFuture<HttpResponse<T>>-olion eikä koskaan estä suoritusta; virheet välittyvät futuurin kautta.
Yksinkertainen sendAsync-kutsu
sendAsync käyttää samaa pyyntöä ja BodyHandler-käsittelijää kuin send. Palautettu futuuri valmistuu, kun vastaus on valmis.
import java.net.URI;
import java.net.http.*;
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.build();
CompletableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Request sent, future created");
}
}Tuloksen muuntaminen thenApply-menetelmällä
Käyttäkää thenApply-metodia tuloksen muuntamiseen sen saapumisen jälkeen — voitte esimerkiksi poimia vastauksesta rungon.
Muunnos suoritetaan synkronisesti siinä säikeessä, joka viimeisteli edellisen vaiheen.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<String> future =
CompletableFuture.completedFuture("OK 200")
.thenApply(body -> "Length=" + body.length());
System.out.println(future.get());
}
}Tuloksen käsittely thenAccept-menetelmällä
Kun tarvitsette vain sivuvaikutuksen ettekä palautusarvoa, käyttäkää thenAccept-metodia. Se ottaa vastaan Consumer-olion ja palauttaa CompletableFuture<Void>-olion.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) throws Exception {
CompletableFuture<Void> done =
CompletableFuture.completedFuture("payload")
.thenAccept(b -> System.out.println("Received: " + b));
done.get();
}
}Odotus join-kutsulla
Kun haluatte odottaa asynkronista tulosta main-metodissa, kutsukaa join()-metodia (tarkistamaton poikkeus) tai get()-metodia (tarkistettu poikkeus). Oikeassa palvelimessa ketjuttaisitte vaiheet estämisen sijaan.
join() käärii virheet tarkistamattomaan CompletionException-poikkeukseen.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Integer> f =
CompletableFuture.supplyAsync(() -> 21).thenApply(n -> n * 2);
int result = f.join();
System.out.println("Result: " + result);
}
}Virheiden käsittely exceptionally-menetelmällä
exceptionally tarjoaa varaarvon, kun vaihe epäonnistuu, ja palauttaa käsittelyketjun toimivaan tilaan.
Näin asynkroninen HTTP-käsittelyketju ei pääty verkkovirheeseen.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> f = CompletableFuture
.<String>supplyAsync(() -> { throw new RuntimeException("boom"); })
.exceptionally(ex -> "fallback: " + ex.getMessage());
System.out.println(f.join());
}
}Kahden pyynnön yhdistäminen
thenCombine odottaa kahta toisistaan riippumatonta futuuria ja yhdistää niiden tulokset. Asynkronisen HTTP:n kanssa sen avulla voidaan noutaa kaksi päätepistettä rinnakkain ja yhdistää rungot.
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "World");
String combined = a.thenCombine(b, (x, y) -> x + " " + y).join();
System.out.println(combined);
}
}Useiden pyyntöjen käynnistäminen rinnakkain
Suorittakaa pyyntöerä keräämällä jokainen futuuri listaan ja käyttämällä sitten komentoa CompletableFuture.allOf(...) kaikkien futuurien valmistumisen odottamiseen.
allOf palauttaa CompletableFuture<Void>-olion; lukekaa yksittäiset tulokset sen jälkeen.
import java.util.*;
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
List<CompletableFuture<Integer>> futures = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
int n = i;
futures.add(CompletableFuture.supplyAsync(() -> n * n));
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
for (var f : futures) System.out.println(f.join());
}
}Asynkronisen mallin yhteenveto
Tyypillinen asynkroninen HTTP-käsittelyketju näyttää tältä:
client.sendAsync(req, BodyHandlers.ofString()).thenApply(HttpResponse::body)rungon hakemiseen.thenAccept(System.out::println)rungon käsittelyyn.exceptionally(ex -> ...)virheestä palautumiseen
Verkkoa odottava säie ei koskaan esty.
Milloin kannattaa käyttää asynkronisuutta
Valitkaa sendAsync, kun teette useita samanaikaisia kutsuja, hajautatte pyynnöt useisiin palveluihin tai suoritatte koodia reaktiivisessa tai estämättömässä palvelimessa. Valitkaa send yksinkertaisiin komentosarjoihin ja yksittäisiin kutsuihin, joissa estäminen on hyväksyttävää.
Pikatarkistus
Tarkistakaa, miten hyvin ymmärrätte asynkroniset pyynnöt.
Kertaus
Opitte tekemään estämättömiä HTTP-kutsuja:
- sendAsync palauttaa
CompletableFuture-olion estämisen sijaan. - thenApply / thenAccept muuntavat ja käsittelevät tuloksen.
- exceptionally tarjoaa varaarvon virheen sattuessa.
- thenCombine yhdistää kaksi rinnakkaista kutsua; allOf odottaa pyyntöerän valmistumista.
- Asynkronisuus sopii suuren samanaikaisuuden ja reaktiivisuuden palvelimiin; synkronisuus sopii yksinkertaisiin komentosarjoihin.
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 ”Asynkroniset pyynnöt” ilmainen?
Kyllä – oppitunnin ”Asynkroniset pyynnöt” 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 ”Asynkroniset pyynnöt”?
sendAsync ja CompletableFuture. 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 2/4.
Kuinka kauan ”Asynkroniset pyynnöt”-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
- java.net.http.HttpClient
- Asynkroniset pyynnöt
- Pyyntörungot ja otsakkeet
- Vastausten käsittely