S-JIS[2011-02-26] 変更履歴
Futureは、Scalaでスレッドを扱うクラスの一種。
scala.actors.FutureはActorを利用して動作する。
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のメソッド。
メソッド | 例 | 備考 |
---|---|---|
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を利用している。 |