Concurrency Średniozaawansowany

Pobieraj wiele URL-i równolegle za pomocą wątków wirtualnych i HttpClient.

✕ 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ć.
♾️

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
Równoległe HTTP z wątkami wirtualnymi
Dostępne

Szeroko dostępne od JDK 21 LTS (wrzesień 2023)

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.