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())
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top