なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Future

 Futureパターン:
要求を受けたら別のスレッドに処理を委譲して、その場では代わりのオブジェクトを取得する。
その後で、実際の実行結果を受け取る。
その際、別スレッドでの処理が終わってない場合、待ち続ける。
 
 Scalaでは
scala.concurrent.ops.futureとか、
scala.actors.Futureとかが存在する。
これらを使えば楽チン、楽チン。
 
例:

import scala.concurrent.ops._
import java.lang.Thread._

object Main {
def main(args: Array[String]) = {
// ここで代わりのオブジェクトを受け取る
val factorial = future {
sleep(500)
println("作業開始")
//階乗を計算
val ret = (1 /: (1 to 10))(_*_)
println("作業終了")
ret
}

println("ちょっと待ちますよ")
sleep(1000)
println("そろそろ出来たかな")

// ここで実際の値を受け取る(完了していない場合は待ち続ける)
println(factorial())
}
}

 
実行結果
ちょっと待ちますよ
作業開始
作業終了
そろそろ出来たかな
3628800
 
 うん、実は総積を求める関数はあったりするんだ(product)。