Java Academy · Lektion

Asynkrone forespørgsler

sendAsync og CompletableFuture

Lektion 2 af 413 trin

Asynkrone forespørgsler er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Asynkrone anmodninger

Det spilder tråde at blokere ved hvert HTTP-kald. JDK's HTTP-klient tilbyder sendAsync, som straks returnerer en CompletableFuture og udfører arbejdet i en baggrundsudfører.

Det giver dig mulighed for at sende mange anmodninger samtidigt og sammensætte deres resultater uden selv at administrere tråde.

send sammenlignet med sendAsync

Signaturerne adskiller sig ved det, de returnerer:

  • send returnerer HttpResponse<T> og blokerer, mens den angiver IOException og InterruptedException.
  • sendAsync returnerer CompletableFuture<HttpResponse<T>> og blokerer aldrig; fejl bliver tilgængelige via den fremtidige værdi.

Et grundlæggende sendAsync-kald

sendAsync tager den samme anmodning og BodyHandler som send. Den returnerede fremtidige værdi bliver færdig, når svaret 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");
    }
}

Omdannelse med thenApply

Brug thenApply til at omdanne resultatet, når det ankommer — for eksempel til at hente brødteksten fra svaret.

Dette kører synkront på den tråd, der færdiggjorde det foregående trin.

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());
    }
}

Forbrug med thenAccept

Når du kun ønsker en bivirkning og ingen returværdi, skal du bruge thenAccept. Den tager en Consumer og giver en CompletableFuture<Void> tilbage.

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();
    }
}

Blokering med join

Hvis du vil vente på et asynkront resultat fra main, skal du kalde join() (ukontrolleret) eller get() (kontrolleret). På en rigtig server ville du kæde trin sammen i stedet for at blokere.

join() pakker fejl ind i en ukontrolleret 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åndtering af fejl med exceptionally

exceptionally leverer en reserveværdi, når et trin mislykkes, og genopretter dermed behandlingsforløbet.

På den måde forhindrer du, at et asynkront HTTP-forløb stopper på grund af en netværksfejl.

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());
    }
}

Sammensætning af to anmodninger

thenCombine venter på to uafhængige fremtidige værdier og sammenfletter deres resultater. Med asynkron HTTP henter dette to endepunkter parallelt og samler brødteksterne.

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);
    }
}

Kørsel af mange parallelt

Hvis du vil køre en gruppe anmodninger, skal du samle hver fremtidige værdi i en liste og derefter bruge CompletableFuture.allOf(...) til at vente på dem alle.

allOf returnerer CompletableFuture<Void>; du læser de enkelte resultater bagefter.

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());
    }
}

Opsummering af det asynkrone mønster

Et typisk asynkront HTTP-behandlingsforløb ser sådan ud:

  • client.sendAsync(req, BodyHandlers.ofString())
  • .thenApply(HttpResponse::body) for at hente brødteksten
  • .thenAccept(System.out::println) for at bruge den
  • .exceptionally(ex -> ...) for at genoprette forløbet

Ingen tråd bliver nogensinde blokeret, mens den venter på netværket.

Hvornår du bør bruge asynkrone kald

Vælg sendAsync, når du foretager mange samtidige kald, sender anmodninger til flere tjenester eller kører i en reaktiv/ikke-blokerende server. Vælg send til simple scripts og enkeltstående kald, hvor blokering er acceptabel.

Hurtigt tjek

Kontrollér din forståelse af asynkrone anmodninger.

Opsummering

Du har lært at foretage ikke-blokerende HTTP-kald:

  • sendAsync returnerer en CompletableFuture i stedet for at blokere.
  • thenApply / thenAccept omdanner og bruger resultatet.
  • exceptionally leverer en reserveværdi ved fejl.
  • thenCombine sammenfletter to parallelle kald; allOf venter på en gruppe.
  • Asynkrone kald passer til servere med høj samtidighed og reaktive servere; synkrone kald passer til simple scripts.
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “Asynkrone forespørgsler” gratis?

Ja — hele teksten til “Asynkrone forespørgsler” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Asynkrone forespørgsler”?

sendAsync og CompletableFuture Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Asynkrone forespørgsler”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. java.net.http.HttpClient
  2. Asynkrone forespørgsler
  3. Request bodies og headers
  4. Håndtering af svar
← Tilbage til Java Academy