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 immediatelyFuture を手動で完了させる
計算の外部から結果を提供するには 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 completedget() と 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 doneisDone、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CompletableFuture の作成と完了
- thenApply と thenCompose による連鎖
- Future の結合:allOf と anyOf
- エラー処理と非同期 HTTP パイプライン