私は現在、将来のコンパニオンオブジェクトを拡張するためのコードを書いています。私が実装する一つの機能は、私がScala FutureとThread.sleepの奇妙な振る舞い
test("A list of Futures return only the first computed value") {
val nums = (0 until 10).toList
val futures =
nums map { n => Future { Thread.sleep(n*1000); n } }
val v = Await.result(Future.any(futures), Duration.Inf)
assert(v === 0)
}
しかし、私は(n+1)*1000
にn*1000
に眠っている時間を切り替えた場合、戻り値は1、ない0で、それを自分のコードをテストしてみましたAny
//returns the future that computes the first value computed from the list. If the first one fails, fail.
def any[T](fs: List[Future[T]]): Future[T] = {
val p = Promise[T]()
fs foreach { f => {
f onComplete {
case Success(v) => p trySuccess v
case Failure(e) => p tryFailure e
}
} }
p.future
}
です正常に動作します(0を返します)。
0でスリープと呼ばれると特別な効果はありますか?
ああ、私は 'blocking'ブロックを追加するのを忘れていました。私はこれらのスレッドが実行コンテキストで実行されていることを忘れていました。あなたのソリューションは完全にうまく動作します。ありがとう。 –