第13章 非同期タスク 非同期タスク
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
最近のワークロードは、利用可能なシステムリソースを効率的に使用する方法について、より多くの考えを必要とする。 非同期タスクは、パフォーマンスのボトルネックを回避することで、アプリケーションのレスポンスを向上させるための優れたツールである。
Java 8では、新しいジェネリック型、CompletableFuture<T> が導入された。この型は、以前から利用可能だったFuture<T> 型を改良したもので、宣言的かつ関数的なアプローチを利用することで、非同期タスクを作成することができる。
この章では、非同期プログラミングを利用する理由と方法、そしてCompletableFuture<T> が、以前のJDKに含まれていたものよりも柔軟で機能的な非同期タスクへのアプローチであることを説明する。
同期と非同期
同期タスクと非同期タスクの概念は、ソフトウェア開発に限ったことではない。
例えば、対面でのミーティングや電話会議は、少なくとも注意を払えば同期アクティビティである。 参加してメモを取る以外は何もできない。 ミーティングや呼び出しが終わるまで、他のタスクはすべてブロックされる。ミーティングや呼び出しが電子メールであった場合、私のミーティングのほとんどがそうであったように、前のタスクを再開する前にすぐに注意を払う必要があるため、現在のタスクが中断されることはない。 したがって、電子メールはブロッキングしないコミュニケーションである。
同じ原則がソフトウェア開発にも当てはまる。 同期的に実行されるタスクは順番に実行され、終了するまで次の作業がブロックされる。 シングルスレッドから見ると、ブロックタスクは結果を待つことを意味し、タスクが終了するまで他のことをしないことでリソースを浪費する可能性がある。
非同期タスクとは、"他のどこか "で処理されるタスクを開始し、それが完了したら通知を受け取るというものだ。 このようなタスクは、並行処理テクニックを使って、通常は別のスレッドに作業を分担させることでノンブロッキングとなり、タスクの終了を待つ必要がなくなる。 したがって、図13-1に示すように、現在のスレッドはブロックされず、他のタスクを続行することができる。
図13-1. 同期実行と非同期実行の比較
第8章で説明したように、並列実行は最大のスループットを第一の目的としている。 一方、CompletableFutureを使用するような非同期実行モデルは、システム全体の遅延と応答性に重点を置いている。 タスクをスピンオフさせることで、シングルスレッドやリソースに制約のある環境でも、応答性の高いシステムを実現することができる。
Java先物
Java 5では、非同期計算の最終結果のコンテナ型として、java.util.concurrent.Future インタフェースが導入された。Future を作成するために、Runnable またはCallable<T> 形式のタスクは、ExecutorService にサブミットされる。 は、別のスレッドでタスクを開始するが、すぐに Future インスタンスを返す。こうすることで、現在のスレッドは、 ...