下面的(人为的)代码尝试在未来打印一个按名称的字符串参数,并在打印完成时返回。
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
字段对于尝试打印它的线程尚不可见?在这里挂起预期的行为吗?
我已经在 Java 1.7 上的 Mac OS Mavericks 和 Windows 7 上使用 Scala 2.10.3 进行了测试。