Scalaにおける並列・並行プログラミングの代表的な手法のひとつに、Future と Promise があります。これらは非同期処理を扱うための主要なツールであり、Javaのスレッドよりも軽量で、非同期なコードの記述を簡潔にします。
1. Futureとは
Futureとは
概要
Future は、将来において完了するかもしれない計算(非同期処理)を表すオブジェクトです。値がまだ利用できないが、いずれ利用可能になることを表現します。完了後に成功(値)または失敗(例外)のどちらかを持ちます。
特徴
-
非同期に処理を実行
-
計算結果の取得は
onComplete,map,flatMap,recoverなどで処理 -
並列処理やコールバック連鎖を自然に記述可能
例
2. Promiseとは
Promiseとは
概要
Promise は、将来に値を「設定する」ための書き込み可能なコンテナであり、Future とペアで使用されます。Promise は Future を生成し、その Future は外部から完了(成功または失敗)させることができます。
特徴
-
Futureが「読み取り専用」なのに対して、Promiseは「書き込み可能」 -
イベントドリブン型の非同期制御が可能
-
外部要因(例:コールバック、イベント)で
Futureを完了させるのに便利
例
3. Future と Promise の違いと関係性
Future と Promise の違いと関係性| 特徴 | Future | Promise |
|---|---|---|
| 役割 | 値の受け手(読み取り) | 値の送り手(書き込み) |
| 完了の制御 | 自動(内部で完了) | 手動(明示的に success/failure) |
| 用途 | 非同期計算の結果の取得 | 非同期処理の結果の外部からの制御 |
4. 使用上の注意
-
Futureは非同期に即座に実行されるため、副作用がある処理には注意が必要です。 -
Promiseの完了処理は1回限りで、それ以降のsuccessやfailure呼び出しは無視されます。 -
ExecutionContext(スレッドプール)の管理が重要です。適切なプールを用意しないと性能やスレッド枯渇に影響します。
5. 応用例:複数の非同期処理の組み合わせ
まとめ
-
Futureは非同期に計算される値を扱うためのクラス -
PromiseはそのFutureに値を外部から与えるための仕組み -
両者を組み合わせることで、非同期・並行プログラミングを柔軟に制御できる
-
Scala標準ライブラリでサポートされており、特にAkkaなどの非同期フレームワークと連携しやすい
生成日:2025/05/04