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

时间:2015-04-12 05:21:15

标签: scala future

我是Scala Future的新手。以下是编程scala书(Dean& Alex第2版第41页 - A Taste of Futures)的示例。我想了解未来的工作方式。

根据我的理解,以下编程应该运行dowork功能5次(dowork(1),dowork(2),dowork(3),dowork(4)和dowork(5),总共5个工作)。

但是当我在Mac上运行Eclipse(Eclipse SDK Build ID:4.0.0-vfinal-20150119-1023-Typesafe的Scala IDE版本)时,从输出(下图)看来它只做了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.")

  }

}

这是输出:

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

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

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

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

进行。

1 个答案:

答案 0 :(得分:4)

如果不运行它,我几乎可以保证问题是你只睡了1000毫秒而不是等待所有未来完成和/或等待io.StdIn.readLine("Press ENTER to continue...")

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