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

「メイン」クラスの初期化中に「testActor」が呼び出されます。アクター コードは別のスレッド (メイン スレッドではない) で実行されており、メイン スレッドで初期化されているクラス (この場合は Main) のメソッドにアクセスしようとしているため、ブロックされ、メッセージを送信できません。メッセージを受信できないため、「receive」がハングします。

「拡張アプリケーション」は使用しないでください。「def main(args: Array[String])」を使用して、多くの手間を省いてください。

http://scala-blogs.org/2008/07/application-trait-considered-harmful.htmlを参照してください。

于 2009-09-04T14:09:12.960 に答える
2

ここApplicationでは、特性とその使用に誤りがあります。Applicationメソッド内ではなく本体内でコードを実行しているmain場合、そのコードは実際にはコンストラクターの一部として実行されています。したがって、testActor() メソッドを呼び出した時点では、オブジェクトは実際には初期化を完了していません。

これを修正するには、println 行をメイン メソッドに移動します。

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

この問題は非常に簡単に発生するため、このApplication特性は悪いニュースと見なされます。

于 2009-09-04T13:43:14.647 に答える