2009-09-04 14 views
2

次のコードがあります。私が俳優の体内の "foo()"への呼び出しにコメントすると、コードは正常に動作します。しかし、 "foo()"が起動されていれば...私のコードはフリーズします!Actor内のメソッド呼び出しは、Scalaでフリーズします

誰もがなぜですか?

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

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

「アプリケーションの拡張」は使用しないでください。 "def main(args:Array [String])"を使用して、多くの問題を解消してください。ここで述べたように

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

2

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

メインメソッドにprintlnの線を移動、それを修正するには:この問題はそう簡単に起こる

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

ので、Application形質は悪いニュースであると考えられています。

+0

を参照してください。http://stackoverflow.com/questions/1332574/common-programming-mistakes-for-scala-developers-to-avoid/1334962#1334962 –

関連する問題