我有以下代码。如果我在演员的身体内注释“foo()”的调用,代码工作正常。但如果“foo()”被激活......我的代码冻结了!
任何kwnows为什么?
import scala.actors.Actor._
object Main extends Application{
def foo() = {
println("I'm on foo")
}
def testActor() = {
val target = self
for(i <- 1 to 100){
actor{
foo()
target ! i
}
}
var total = 0
receive{
case x:Int => total += x
}
total
}
println("Result: " + testActor())
}
答案 0 :(得分:2)
Application
特征及其使用在此处有误。如果代码在Application
的主体内而不是main
方法内运行,则该代码实际上是作为构造函数的一部分运行的。因此,在您调用testActor()方法时,该对象实际上尚未完成初始化。
要修复它,请将println行移动到main方法中:
def main (args: Array[String]) {
println("Result: " + testActor())
}
因为这个问题很容易发生,Application
特征被认为是坏消息。
答案 1 :(得分:2)
在“Main”类初始化时调用“testActor”。 actor代码在不同的线程(不是主线程)中执行,并且它被阻止并且不能发送任何消息,因为它试图访问在主线程中初始化的类(在本例中为Main)中的方法。 “接收”挂起,因为它无法接收任何消息。
请勿使用“扩展应用程序”。使用“def main(args:Array [String])”并为自己省去很多麻烦。
请参阅http://scala-blogs.org/2008/07/application-trait-considered-harmful.html