S-JIS[2011-02-26] 変更履歴

Scala Future

Futureは、Scalaスレッドを扱うクラスの一種。
scala.actors.FutureはActorを利用して動作する。


Futuresオブジェクトで定義されているメソッド

Futureを扱う(Futureを生成する)為のメソッドがscala.actors.Futuresオブジェクトに定義されている。

import scala.actors.Futures._
メソッド 備考
alarm
val w = alarm(1*1000) //ミリ秒単位

//何らかの処理

w() //時間が経過するまで待つ
指定された時間が経過するまで待つ。
future
val f = future {
  List.range(1, 10000+1).sum
}

//ここで別の処理を行う

val r = f() //計算結果を取得する
別スレッドで計算を実行し、計算結果を受け取る為に使用する。
futureメソッドはFutureクラスのインスタンスを返す。
そのapply()メソッドを呼ぶと結果が取れる。
計算が終了するまで、apply()メソッドは待ちに入る。
awaitEither
val f1 = future {
  List.range(1, 10000+1).sum
}
val f2 = future {
  Array.range(1, 10000+1).sum
}

val r = awaitEither(f1, f2)
2つのFutureを受け取り、どちらか早く終わった方の結果を返す。
awaitAll
val fs = for(i <- 0 until 10) yield future {
  val n = (i%4) * 1000
//println("start"+i+"="+n)
  Thread.sleep(n)
//println("end"+i)
  i
}

val r = awaitAll(2*1000, fs:_*)
r: List[Option[Any]] = List(Some(0), Some(1), None, None, Some(4), Some(5), None, None, None, None)
複数のFutureが終わるのを一定時間待つ。

10個のFutureを渡すと、要素数が10個のListが返ってくる。
各要素はFutureの戻り値を包んだOption[Any]
(なんでAnyなんだろうな? 異なる型を返すFutureを混在させても大丈夫なようにする為か?)
awaitAllが終わる時点でFutureが終わっていればSome(値)、終わっていなければNoneになる。

Futureクラス

Futureのメソッド。

メソッド 備考
apply
val r = f()
val r = f.apply()
計算結果を返す。
計算がまだ終わっていない場合、終わるまで待つ。
isSet
val f = future { Thread.sleep(5*1000) }

while(!f.isSet) {
  println("実行中")
  Thread.sleep(1*1000)
}
val r = f()
計算結果がセットされている場合true。
respond    
foreach
filter
map
flatMap
  respondを利用している。

スレッドへ戻る / Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま