Równoległe HTTP z wątkami wirtualnymi
Pobieraj wiele URL-i równolegle za pomocą wątków wirtualnych i HttpClient.
Porównanie kodu
✕ 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();
}
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Jeden wątek na żądanie
Bez dobierania rozmiaru puli — jeden wątek wirtualny na URL.
Prosty kod
Pisz bezpośredni, blokowalny kod.
Wysoka przepustowość
Tysiące równoległych żądań przy minimalnych zasobach.
Stare podejście
Pula wątków + URLConnection
Nowoczesne podejście
Wątki wirtualne + HttpClient
Od JDK
21
Poziom trudności
Średniozaawansowany
Wsparcie JDK
Równoległe HTTP z wątkami wirtualnymi
Dostępne
Szeroko dostępne od JDK 21 LTS (wrzesień 2023)
Jak to działa
Wątki wirtualne sprawiają, że tworzenie jednego wątku na żądanie HTTP jest praktyczne. W połączeniu z HttpClient zastępuje złożone wzorce asynchronicznych callbacków prostym blokowalnym kodem, który dobrze skaluje.
Powiązana dokumentacja
Dowód