Concurrency 中級

バーチャルスレッドによる並行HTTP処理

バーチャルスレッドとHttpClientを使って多数のURLを並行取得する。

✕ 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();
}
このコードに問題がありますか? お知らせください。
♾️

リクエストごとのスレッド

プールのサイジング不要 — URLごとに1バーチャルスレッド。

📖

シンプルなコード

わかりやすいブロッキングコードをそのまま書けます。

高スループット

最小限のリソースで何千もの並行リクエストを処理できます。

旧来のアプローチ
スレッドプール + URLConnection
モダンなアプローチ
バーチャルスレッド + HttpClient
JDKバージョン
21
難易度
中級
バーチャルスレッドによる並行HTTP処理
利用可能

JDK 21 LTS(2023年9月)以降、広く利用可能

バーチャルスレッドにより、HTTPリクエストごとにスレッドを作成することが実用的になります。HttpClientと組み合わせることで、複雑な非同期コールバックパターンを、スケールするシンプルなブロッキングコードに置き換えられます。

共有 𝕏 🦋 in