読者です 読者をやめる 読者になる 読者になる

spawnとfuture

Scala

scala.concurrent.ops以下に、Concurrentな便利メソッドがいくつか定義されています。
ここではその代表的な例としてspawnとfutureを紹介します。


まず、spawn。
これは戻り値のいらない処理をバックグラウンドで動かすのに使います。

import scala.concurrent.ops._

object Main {
  def main(args: Array[String]) {
    println("a")

    spawn {
      val result : Int = List.range(0, 10).sum
      println(result)
    }

    println("b")
  }
}
a
b
45

ここではステートメントのように扱っていますが、実際は高階関数なのでメソッドを渡せます。


次にfuture。
futureは戻り値がほしいときに使います。
処理が終わったころに結果を問い合せて、処理が終わってたら値が返ってきて、終わってなかったら待機します。

import scala.concurrent.ops._

object Main {
  def main(args: Array[String]) {
    println("a")

    var x = future {
      List.range(0, 10).sum
    }

    println("b")

    val result : Int = x()
    println(result)
  }
}
a
b
45


Actorの方にもfutureがあるようです。
(spawnはない。AkkaのActorにはあるそうです)

import scala.actors._, Futures._

object Main {
  def main(args: Array[String]) {
    println("a")

    var x : Future[Int] = future {
      List.range(0, 10).sum
    }

    println("b")

    val result : Int = x()
    println(result)
  }
}
a
b
45