Methodenaufruf innerhalb Schauspieler gefriert in Scala
Frage
ich den folgenden Code haben. Wenn ich den Anruf zu „foo ()“ innerhalb der Schauspieler Körper kommentieren, funktioniert der Code in Ordnung. Aber wenn "foo ()" aktiviert ist ... mein Code friert!
Jeder kwnows warum?
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())
}
Lösung
„testActor“ genannt wird, während die „Main“ Klasse initialisiert. Der Schauspieler-Code wird in einem anderen Thread ausgeführt wird (nicht der Haupt-Thread) und es blockiert und jede Nachricht nicht senden kann, weil es versucht, eine Methode in einer Klasse (Haupt in diesem Fall) zuzugreifen, die in dem Hauptthread wird initialisiert. „Empfangen“ hängt, weil es keine Nachricht empfangen kann.
Verwenden Sie keine "erweitert Application". Verwenden Sie "def main (args: Array [String])". Und sparen Sie sich eine Menge Ärger
Siehe http://scala-blogs.org/ 2008/07 / application-Zug-als-harmful.html
Andere Tipps
Der Application
Charakterzug und seine Verwendung ist hier Verschulden trifft. Wenn Sie Code laufen im Körper eines Application
anstatt innerhalb einer main
Methode haben, wird dieser Code ausgeführt werden tatsächlich als Teil des Konstrukteurs. Also an der Stelle, wo Sie die testActor () -Methode aufrufen, das Objekt nicht wirklich fertig Initialisierung.
Um es zu beheben, die println Linie in ein Hauptverfahren verschieben:
def main (args: Array[String]) {
println("Result: " + testActor())
}
Da dieses Problem so leicht geschieht, das Application
Merkmal betrachtet eine schlechte Nachricht zu sein.