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を利用している。 |