バーチャルスレッドによる並行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
難易度
中級
JDKサポート
バーチャルスレッドによる並行HTTP処理
利用可能
JDK 21 LTS(2023年9月)以降、広く利用可能
仕組み
バーチャルスレッドにより、HTTPリクエストごとにスレッドを作成することが実用的になります。HttpClientと組み合わせることで、複雑な非同期コールバックパターンを、スケールするシンプルなブロッキングコードに置き換えられます。
関連ドキュメント