为什么这个例子会错过一个 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
,您也可能会看到这个。
我是 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
,您也可能会看到这个。