Skip to content

Part VII: 非同期プログラミング

概要

本章では、Java の CompletableFuture と Virtual Threads(Java 21)を使った非同期プログラミングを学びます。


CompletableFuture

基本的な使い方

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 非同期処理
    return "Result";
});

// 結果を取得
String result = future.get();

チェーン処理

CompletableFuture.supplyAsync(() -> fetchData())
    .thenApply(data -> process(data))
    .thenAccept(result -> save(result));

並行実行

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> fetchData1());
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> fetchData2());

// すべての完了を待機
CompletableFuture.allOf(future1, future2).join();

Virtual Threads (Java 21+)

基本的な使い方

// Virtual Thread で実行
Thread.startVirtualThread(() -> {
    System.out.println("Running in virtual thread");
});

// Virtual Thread の ExecutorService
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    executor.submit(() -> {
        System.out.println("Task in virtual thread");
    });
}

プラットフォームスレッドとの違い

特性 プラットフォームスレッド Virtual Thread
作成コスト 高い 低い
メモリ ~1MB/スレッド ~KB/スレッド
最大数 数千 数百万
ブロッキング 非効率 効率的

使い分けの指針

シナリオ 推奨
I/O バウンド Virtual Thread / CompletableFuture
CPU バウンド プラットフォームスレッド
混合 Virtual Thread + 並列ストリーム

次のステップ

Part VIII では、MapReduce パターンと分散並列処理を学びます。


参考資料