0Pricing
Java Academy · レッスン

CompletableFuture の作成と完了

supplyAsync、runAsync、completedFuture を使い、complete と completeExceptionally で Future を手動で完了させます。

「CompletableFuture の作成と完了」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

CompletableFuture とは

CompletableFuture<T>(Java 8 以降)は、明示的に完了させたり、連結したり、組み合わせたりできる非同期計算を表します。Future と CompletionStage の両方を実装しています。

supplyAsync: 非同期計算を開始する

CompletableFuture.supplyAsync() は共通の ForkJoinPool で Supplier を実行し、結果を表す future を返します。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // runs on ForkJoinPool.commonPool()
    return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");

runAsync: 実行して待たない

runAsync() は Runnable を非同期で実行し、CompletableFuture<Void> を返します。結果が必要ない場合に使用します。

CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
    sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));

カスタム Executor

計算に使用するスレッドプールを制御するには、カスタム Executor を渡します。共通プールをブロックさせたくない Web アプリケーションでは特に重要です。

ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
    () -> userService.findById(42L), pool
);

completedFuture: 完了済みの値

CompletableFuture.completedFuture(value) は、すでに完了している future を返します。テストや、非同期パイプラインで即時に返せる値がある場合に便利です。

CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediately

Future を手動で完了させる

計算の外部から結果を提供するには complete() を使用します。失敗を通知するには completeExceptionally() を使用します。

CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!");       // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get();   // blocks until completed

get() と join()

get() と join() はどちらも future が完了するまでブロックします。get() はチェック例外をスローし、join() はそれらを非チェック例外である CompletionException にラップします。

try {
    String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)

非ブロッキングな確認に getNow() を使う

getNow(defaultValue) は、すでに完了していれば結果を返し、完了していなければ指定されたデフォルト値を返します。ブロックせず、待機もしません。

String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet done

isDone、isCancelled、isCompletedExceptionally

ブロックせずに future の状態を確認します。これらの確認をポーリングループや監視コードで組み合わせて使用します。

if (future.isDone())                    System.out.println("Completed");
if (future.isCancelled())               System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");

タイムアウト処理に cancel() を使う

実行中の計算をキャンセルするには cancel(true) を呼び出します。future はキャンセル済み状態に遷移し、ブロック中の get() は CancellationException をスローします。

CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);

completeOnTimeout(Java 9 以降)

completeOnTimeout(value, timeout, unit) は、タイムアウトまでに future が完了していなければ、デフォルト値で自動的に完了させます。手動でキャンセルするよりもすっきり記述できます。

CompletableFuture<String> result = fetchAsync()
    .completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3s

確認問題

共通の ForkJoinPool で非同期計算を開始し、値を返すメソッドはどれですか。

まとめ

supplyAsync / runAsync で非同期処理を開始します。complete / completeExceptionally で手動で完了させます。チェック例外を伴わずにブロックするには join() を使用します。completeOnTimeout でタイムアウトを適切に処理できます。

よくある質問

「CompletableFuture の作成と完了」レッスンは無料ですか?

はい。「CompletableFuture の作成と完了」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「CompletableFuture の作成と完了」で何を学びますか?

supplyAsync、runAsync、completedFuture を使い、complete と completeExceptionally で Future を手動で完了させます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「CompletableFuture の作成と完了」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CompletableFuture の作成と完了
  2. thenApply と thenCompose による連鎖
  3. Future の結合:allOf と anyOf
  4. エラー処理と非同期 HTTP パイプライン
← Java Academyに戻る