Parallele HTTP-Anfragen mit Virtual Threads
Viele URLs gleichzeitig mit Virtual Threads und HttpClient abrufen.
Code-Vergleich
✕ 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.
Warum der moderne Weg gewinnt
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
JDK-Unterstützung
Parallele HTTP-Anfragen mit Virtual Threads
Verfügbar
Weitgehend verfügbar seit JDK 21 LTS (Sept. 2023)
Wie es funktioniert
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.
Zugehörige Dokumentation