FutureとPromise

Scalaにおける並列・並行プログラミングの代表的な手法のひとつに、FuturePromise があります。これらは非同期処理を扱うための主要なツールであり、Javaのスレッドよりも軽量で、非同期なコードの記述を簡潔にします。


1. Futureとは

概要

Future は、将来において完了するかもしれない計算(非同期処理)を表すオブジェクトです。値がまだ利用できないが、いずれ利用可能になることを表現します。完了後に成功(値)または失敗(例外)のどちらかを持ちます。

特徴

  • 非同期に処理を実行

  • 計算結果の取得は onComplete, map, flatMap, recover などで処理

  • 並列処理やコールバック連鎖を自然に記述可能

scala
import scala.concurrent.{Future, ExecutionContext} import scala.util.{Success, Failure} import scala.concurrent.ExecutionContext.Implicits.global val f: Future[Int] = Future { // 非同期で実行される処理 Thread.sleep(1000) 42 } f.onComplete { case Success(value) => println(s"Success: $value") case Failure(e) => println(s"Failed: ${e.getMessage}") }

2. Promiseとは

概要

Promise は、将来に値を「設定する」ための書き込み可能なコンテナであり、Future とペアで使用されます。PromiseFuture を生成し、その Future は外部から完了(成功または失敗)させることができます。

特徴

  • Future が「読み取り専用」なのに対して、Promise は「書き込み可能」

  • イベントドリブン型の非同期制御が可能

  • 外部要因(例:コールバック、イベント)で Future を完了させるのに便利

scala
import scala.concurrent.{Promise, Future} import scala.concurrent.ExecutionContext.Implicits.global val promise = Promise[Int]() val future: Future[Int] = promise.future // 別スレッドなどで将来値を設定 Future { Thread.sleep(500) promise.success(100) // または promise.failure(new Exception("error")) } future.onComplete { case Success(value) => println(s"Completed with: $value") case Failure(e) => println(s"Failed with: ${e.getMessage}") }

3. FuturePromise の違いと関係性

特徴 Future Promise
役割 値の受け手(読み取り) 値の送り手(書き込み)
完了の制御 自動(内部で完了) 手動(明示的に success/failure
用途 非同期計算の結果の取得 非同期処理の結果の外部からの制御

4. 使用上の注意

  • Future は非同期に即座に実行されるため、副作用がある処理には注意が必要です。

  • Promise の完了処理は1回限りで、それ以降の successfailure 呼び出しは無視されます。

  • ExecutionContext(スレッドプール)の管理が重要です。適切なプールを用意しないと性能やスレッド枯渇に影響します。


5. 応用例:複数の非同期処理の組み合わせ

scala
val f1 = Future { 10 } val f2 = Future { 20 } val combined = for { a <- f1 b <- f2 } yield a + b combined.foreach(println) // 出力: 30

まとめ

  • Future は非同期に計算される値を扱うためのクラス

  • Promise はその Future に値を外部から与えるための仕組み

  • 両者を組み合わせることで、非同期・並行プログラミングを柔軟に制御できる

  • Scala標準ライブラリでサポートされており、特にAkkaなどの非同期フレームワークと連携しやすい

生成日:2025/05/04