Der Actor
... [ Seminar Programmiersprachen und -Systeme ] ... [ Inhaltsverzeichnis ] ... [ Nachrichten ] ...
Übersicht: Der Actor
Erstellen von Actors (Vererbung)
Es gibt zwei Wege Actors zu erstellen. Zum einen existiert die abstrakte Klasse Actor, welche beerbt werden kann. Diese beinhaltet die abstrakte Methode act(), welche das Verhalten des Actors definieren wird.
Beispiel für das Erstellen eines einfachen Actors, der sich kurz zu Wort meldet:
import scala.actors._
object meinErsterActor extends Actor {
def act() {
println("Hallo Welt")
}
}
Hallo Welt
Gestartet wird dieser Actor durch Aufruf der Methode meinErsterActor.start().
Erstellen von Actors (Fabrikmethode)
Der zweite Weg einen Actor zu erstellen, ist die Funktion actor aus dem object scala.actors.Actor zu verwenden. Hier definiert man direkt in dem Block hinter dem Funktionsaufruf die act() Methode, ohne diese explizit zu nennen.
Wird ein Actor auf diese Weise erstellt, ist es nicht mehr nötig ihn per start() Methode zu erwecken. Er wird sofort nach der Definition anfangen zu arbeiten.
Beispiel für das Erstellen eines Actors mit der actor Methode:
import scala.actors.Actor._
val meinZweiterActor = actor {
for (i <- 1 to 3)
println("Hallo Welt")
}
Hallo Welt
Hallo Welt
Hallo Welt
Auf diese Arten können Actors also erstellt und gestartet werden. In der Scala API wird die Fabrikmethode empfohlen.
Verschicken von Nachrichten
Wir sind nun in der Lage voneinander unabhängige Actors zu erstellen und zu starten. Nun müssen diese aber auch noch miteinander kommunizieren können. Dazu schicken sie sich gegenseitig Nachrichten, die in der Mailbox eines Actors bleiben bis er sie verarbeitet.
Im Folgenden werden also drei verschiedene Möglichkeiten zum Versenden von Nachrichten vorgestellt.
Vorweg: Die hier vorgestellten "Operatoren" sind keine echten Operatoren. Es handelt sich viel mehr um Funktionen, die durch eine spezielle Syntax von Scala wie Operatoren aussehen.
Der ! "Operator":
Definition:
! (msg : Any) : Unit
Die Nachricht msg wird an die Mailbox eines Empfängers geschickt. Der Sender erwartet keine Antwort und kann dementsprechend sofort weiter arbeiten. Der Empfänger erhält die Nachricht und wird versuchen diese zu verarbeiten. Es findet also eine asynchrone Kommunikation statt.
Der ! "Operator" ist der wichtigste "Operator" für Actors in Scala und wird in allen folgenden Beispielen Verwendung finden.
Der !? "Operator":
Definition:
!? (msg : Any) : Any
!? (msec : Long, msg : Any) : Option[Any]
In beiden Fällen wird eine Nachricht msg an einen Empfänger gesendet. Der Sender wartet nach dem Verschicken auf eine Antwort des Empfängers. Im zweiten Fall lässt sich noch eine Wartezeit in msec definieren, die der Sender auf die Antwort wartet. Da der Sender erst weiterarbeiten kann, wenn er eine Antwort erhalten hat, handelt es sich hier um eine synchrone Kommunikation.
Der !! "Operator":
Definition:
!! (msg : Any) : Future[Any]
!! [A](msg : Any, f : PartialFunction[Any, A]) : Future[A]
Hier wird wieder eine Nachricht msg an einen Empfänger gesendet, jedoch bekommt der Sender sofort eine Antwort. Er erhält umgehend ein Future Objekt. Dieses Objekt blockt den Sender erst, wenn dieser versucht auf die Daten zuzugreifen, die er vom Empfänger erwartet. So lange er nicht auf die Daten zugreift, kann er problemlos weiter arbeiten. Das Future Objekt liefert mittels der Methode isSet() : boolean eine Möglichkeit abzufragen, ob bereits ein Wert vorhanden ist.
Im zweiten Fall wird noch eine partielle Funktion übergeben, die zur Verarbeitung der Antwort genutzt werden kann.
... [ Seminar Programmiersprachen und -Systeme ] ... [ Inhaltsverzeichnis ] ... [ Nachrichten ] ...