Asynkrone forespørsler
sendAsync og CompletableFuture
Asynkrone forespørsler er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Asynkrone forespørsler
Å blokkere ved hvert HTTP-kall sløser bort tråder. JDK HTTP-klienten tilbyr sendAsync, som returnerer en CompletableFuture umiddelbart og utfører arbeidet på en bakgrunns-executor.
Dette gjør det mulig å sende mange forespørsler samtidig og sette sammen resultatene uten å administrere tråder manuelt.
send kontra sendAsync
Signaturene skiller seg i hva de returnerer:
- send returnerer
HttpResponse<T>og blokkerer, og deklarererIOExceptionogInterruptedException. - sendAsync returnerer
CompletableFuture<HttpResponse<T>>og blokkerer aldri; feil blir tilgjengelige via futuren.
Et grunnleggende kall til sendAsync
sendAsync tar den samme forespørselen og BodyHandler som send. Den returnerte futuren fullføres når responsen er klar.
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");
}
}Transformere med thenApply
Bruk thenApply til å transformere resultatet når det kommer – for eksempel ved å hente ut innholdet fra responsen.
Dette kjører synkront på tråden som fullførte det forrige trinnet.
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());
}
}Konsumere med thenAccept
Når De bare ønsker en bivirkning og ingen returverdi, bruker De thenAccept. Den tar en Consumer og gir en CompletableFuture<Void>.
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();
}
}Blokkere med join
For å vente på et asynkront resultat fra main kan De kalle join() (ukontrollert) eller get() (kontrollert). På en ekte server ville De satt sammen trinnene i stedet for å blokkere.
join() pakker feil inn i et ukontrollert CompletionException.
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);
}
}Håndtere feil med exceptionally
exceptionally angir en reserveverdi når et trinn mislykkes, slik at kjeden kan gjenopprettes.
Slik hindrer De at en asynkron HTTP-flyt stopper ved en nettverksfeil.
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());
}
}Kombinere to forespørsler
thenCombine venter på to uavhengige futurer og slår sammen resultatene. Med asynkron HTTP henter dette to endepunkter parallelt og slår sammen innholdet.
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);
}
}Sende mange parallelt
For å kjøre en gruppe forespørsler samler De hver future i en liste og bruker deretter CompletableFuture.allOf(...) til å vente på alle.
allOf returnerer CompletableFuture<Void>; de individuelle resultatene leses etterpå.
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());
}
}Oppsummering av asynkront mønster
En typisk asynkron HTTP-kjede ser slik ut:
client.sendAsync(req, BodyHandlers.ofString()).thenApply(HttpResponse::body)for å hente innholdet.thenAccept(System.out::println)for å konsumere det.exceptionally(ex -> ...)for å gjenopprette kjeden
Ingen tråd blokkeres noen gang mens den venter på nettverket.
Når bør man bruke asynkron kjøring
Velg sendAsync når De gjør mange samtidige kall, sender forespørsler til flere tjenester eller kjører i en reaktiv/ikke-blokkerende server. Velg send for enkle skript og enkeltstående kall der blokkering er uproblematisk.
Kunnskapssjekk
Test forståelsen Deres av asynkrone forespørsler.
Oppsummering
De har lært å gjøre ikke-blokkerende HTTP-kall:
- sendAsync returnerer en
CompletableFuturei stedet for å blokkere. - thenApply / thenAccept transformerer og konsumerer resultatet.
- exceptionally leverer en reserveverdi ved feil.
- thenCombine slår sammen to parallelle kall; allOf venter på en gruppe.
- Asynkron kjøring passer for servere med høy samtidighet og reaktive servere; synkron kjøring passer for enkle skript.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Asynkrone forespørsler» gratis?
Ja – hele teksten i «Asynkrone forespørsler» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Asynkrone forespørsler»?
sendAsync og CompletableFuture Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Asynkrone forespørsler»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- java.net.http.HttpClient
- Asynkrone forespørsler
- Forespørselsdata og headere
- Håndtere svar