Concurrency Fortgeschritten

Parallele HTTP-Anfragen mit Virtual Threads

Viele URLs gleichzeitig mit Virtual Threads und HttpClient abrufen.

✕ Java 8
ExecutorService pool =
    Executors.newFixedThreadPool(10);
List<Future<String>> futures =
    urls.stream()
    .map(u -> pool.submit(
        () -> fetchUrl(u)))
    .toList();
// manual shutdown, blocking get()
✓ Java 21+
try (var exec = Executors
    .newVirtualThreadPerTaskExecutor()) {
    var results = urls.stream()
        .map(u -> exec.submit(
            () -> client.send(req(u),
                ofString()).body()))
        .toList().stream()
        .map(Future::join).toList();
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.
♾️

Ein Thread pro Anfrage

Kein Pool-Sizing — ein Virtual Thread pro URL.

📖

Einfacher Code

Unkomplizierten blockierenden Code schreiben.

Hoher Durchsatz

Tausende von gleichzeitigen Anfragen mit minimalen Ressourcen.

Alter Ansatz
Thread-Pool + URLConnection
Moderner Ansatz
Virtual Threads + HttpClient
Seit JDK
21
Schwierigkeitsgrad
Fortgeschritten
Parallele HTTP-Anfragen mit Virtual Threads
Verfügbar

Weitgehend verfügbar seit JDK 21 LTS (Sept. 2023)

Virtual Threads machen es praktikabel, einen Thread pro HTTP-Anfrage zu erstellen. In Kombination mit HttpClient ersetzt dies komplexe asynchrone Callback-Muster durch einfachen blockierenden Code, der skaliert.

Teilen 𝕏 🦋 in