import scala.actors._ import Actor._ class Kunde(val id: Int) extends Actor { var geschoren = false override def toString = id.toString def act { loop { react { case 'fertig => { geschoren = true println("[k] Ich, Kunde " + id + ", bin geschoren") } } } } } class Barbier extends Actor { def act { loop { react { case kunde: Kunde => bedienen(kunde) } } } def bedienen(kunde: Kunde) { if (mailboxSize > 3) { println("[b] Kunde " + kunde + " geht, Laden ist voll") } else { println("[b] Schneide Kunden " + kunde + " die Haare ...") Thread.sleep((100 * scala.math.random).toLong) kunde ! 'fertig } } } object SleepingBarber extends Application { val barbier = new Barbier barbier.start // erzeuge Liste von Kunden: val kunden: Array[Kunde] = Array.ofDim(10); for (i <- 0 to kunden.size - 1) { kunden(i) = new Kunde(i) } // Kunden kommen in zufälligen Zeitabständen an: for (kunde <- kunden) { kunde.start Thread.sleep((25 * scala.math.random).toLong) barbier ! kunde // wecke ggf. den Barbier ... } // Abrechnung: Thread.sleep(2000) // <-- warten, bis der letzte Kunde sicher fertig ist ... val anzahl = kunden.filter(_.geschoren).size //filter(x => x.geschoren) size println("[!] " + anzahl + " Kunden geschoren.") System.exit(0) }