我是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。
进行。
答案 0 :(得分:4)
如果不运行它,我几乎可以保证问题是你只睡了1000毫秒而不是等待所有未来完成和/或等待io.StdIn.readLine("Press ENTER to continue...")
。
如果您在println
之前添加sleep
,也可能会看到这一点。