1. なぜ従来のOSスレッドモデルは限界に達したのか?
従来のJavaにおけるスレッドモデルは、OSのネイティブスレッドと1対1でマッピングされていました。各スレッドは約1MBのスタックメモリを消費し、コンテキストスイッチのオーバーヘッドも無視できませんでした。そのため、秒間数万件のHTTPリクエストを処理する環境ではスレッドプールの枯渇やメモリ圧迫が日常茶飯事でした。
2. Java 21 仮想スレッド(Virtual Threads)の革命的利点
Java 21で正式導入された仮想スレッドは、JVM内部で管理される超軽量スレッドです。メモリフットプリントはわずか数百バイト。I/Oブロッキング(DBクエリや外部API呼び出し)が発生すると、自動的にキャリアスレッドを解放し、他のタスクにCPUを譲ります。
// Java 21 仮想スレッドのシンプルな生成例
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
});
});
} // すべてのタスク完了を自動待機
3. Spring Boot 3.2+ での超簡単有効化
Spring Boot 3.2以降では、以下の1行を application.properties に追記するだけで、Tomcatのワーカースレッドがすべて仮想スレッド化されます:
spring.threads.virtual.enabled=true
これにより、従来のブロッキングコードの読みやすさを維持したまま、リアクティブプログラミング(WebFlux)に匹敵する超高スループットを手に入れることができます。