为什么这个例子会错过一个 Future 结果?

Why does this example miss one Future result?

我是 Scala Future 的新手。下面是编程 scala 书(Dean & Alex 第 2 版第 41 页 - 未来的品味)中的示例。我试图了解未来的工作方式。

根据我的理解,下面的编程应该运行 dowork函数5次(dowork(1), dowork(2), dowork(3), dowork(4) and dowork(5), 5 jobs总共)。

但是当我 运行 它在 Mac 上的 Eclipse(Eclipse SDK Build id 的 Scala IDE 版本:4.0.0-vfinal-20150119-1023-Typesafe)中时,从输出(下图)看来它只执行了 4 次(dowork(1)、dowork(2)、dowork(3) 和 dowork(4))。

不知道有什么问题?你能解释一下发生了什么吗?

package com.future.test

import java.sql.Timestamp
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

object TestFutures {

  def sleep(millis: Long) = {
    Thread.sleep(millis)
  }

  // Busy Work:)
  def dowork(index: Int) = {
    val time = (math.random * 1000).toLong
    sleep(time)
    println()
    println(s"index: $index " +  new Timestamp(System.currentTimeMillis()) + s" time used: $time.")
    index
  }

  def main(args: Array[String]) {

    (1 to 5) foreach {
      index =>
        val future =
          Future {
            dowork(index)
          }
        future onSuccess {
          case answer: Int => println(s"Success! returned: $answer.")
        }
        future onFailure {
          case th: Throwable => println(s"Failed! returned: $th.")
        }
    }

    sleep(1000)
    println("done.")

  }

}

这是输出:

索引:1 2015-04-11 23:06:01.273 使用时间:272。 成功!返回:1.

索引:3 2015-04-11 23:06:01.45 使用时间:451。 成功!返回:3.

索引:4 2015-04-11 23:06:01.461 使用时间:462。 成功!返回:4.

索引:2 2015-04-11 23:06:01.773 使用时间:777。 成功!返回:2.

完成。

没有 运行 它,我几乎可以保证问题是你只睡了 1000 毫秒,而不是等待所有期货完成 and/or 使用 io.StdIn.readLine("Press ENTER to continue...") 等待。

如果您在 sleep 之前添加一个 println,您也可能会看到这个。