2

我有以下代码。如果我在演员体内注释对“foo()”的调用,则代码可以正常工作。但是如果“foo()”被激活……我的代码就会冻结!

有谁知道为什么?

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())
}
4

2 回答 2

2

这里的Application特征及其使用是错误的。当您在 a 的主体中Application而不是在main方法中运行代码时,该代码实际上是作为构造函数的一部分运行的。因此,在调用 testActor() 方法时,对象实际上还没有完成初始化。

要修复它,请将 println 行移动到 main 方法中:

def main (args: Array[String]) {
    println("Result: " + testActor())
}

因为这个问题很容易发生,所以这个Application特征被认为是坏消息。

于 2009-09-04T13:43:14.647 回答
2

在“Main”类初始化时调用“testActor”。演员代码在不同的线程(不是主线程)中执行,它被阻塞并且无法发送任何消息,因为它试图访问在主线程中初始化的类(在本例中为 Main)中的方法。“接收”挂起,因为它无法接收任何消息。

不要使用“扩展应用程序”。使用 "def main(args: Array[String])" 可以省去很多麻烦。

http://scala-blogs.org/2008/07/application-trait-considered-harmful.html

于 2009-09-04T14:09:12.960 回答