Scala Future和Thread.sleep的奇怪行为

时间:2016-10-10 05:04:43

标签: multithreading scala concurrency sleep future

我目前正在编写代码以扩展Future随播对象。我想要实现的一个功能是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
}

我尝试用

测试我的代码
  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)
  }

但是返回的值是1,而不是0.当我将睡眠时间切换到n*1000(n+1)*1000时,它工作正常(返回0)。

在0上调用睡眠时是否有任何特殊效果?

2 个答案:

答案 0 :(得分:1)

Thread.sleepFuture中的阻止操作,但您没有发信号通知ExecutionContext您正在执行此操作,因此行为会因您使用的ExecutionContext以及操作方式而异你的机器有很多处理器。如果添加blocking

,您的代码会按预期使用ExecutionContext.global
nums map { n => Future { blocking { Thread.sleep(n*1000); n } } }

答案 1 :(得分:0)

我认为函数名称是any所以我认为你正确地实现了any。 但是如果你想要第一个,你只需从List参数fs获得第一个元素并完成一个诺言。