【发布时间】:2013-11-23 02:58:27
【问题描述】:
下面的(人为的)代码尝试在未来打印一个按名称的字符串参数,并在打印完成时返回。
import scala.concurrent._
import concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
class PrintValueAndWait {
def printIt(param: => String): Unit = {
val printingComplete = future {
println(param); // why does this hang?
}
Await.result(printingComplete, Duration.Inf)
}
}
object Go {
val str = "Rabbits"
new PrintValueAndWait().printIt(str)
}
object RunMe extends App {
Go
}
但是,在运行 RunMe 时,它只是在尝试评估 param 时挂起。将printIt 更改为按值接收其参数会使应用程序按预期返回。或者,将printIt 更改为简单地打印值并同步返回(在同一个线程中)似乎也可以正常工作。
这里到底发生了什么?这是否与尚未完全构建的 Go 对象有关,因此 str 字段对于尝试打印它的线程尚不可见?是否在此处挂起预期的行为?
我已经在 Mac OS Mavericks 和 Windows 7 以及 Java 1.7 上使用 Scala 2.10.3 进行了测试。
【问题讨论】:
标签: multithreading scala object future pass-by-name