Actor中的方法调用在Scala中冻结

时间:2009-09-04 12:47:05

标签: scala freeze

我有以下代码。如果我在演员的身体内注释“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())
}

2 个答案:

答案 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