import scala.actors._ import Actor._ case class Get() case class Put() class Besteck(left: Gabel, right: Gabel) extends Actor { start def act = loop { react { case Get if (left.available && right.available) => left.available = false right.available = false reply() case Put => left.available = true right.available = true } } } class Gabel { var available = true } class Philosoph (val id: String, val besteck: Besteck) extends Actor { start def act = loop { essen denken } private def essen { println(id+" versucht, beide Gabel zu nehmen ...") besteck !? Get println(id+" isst ...") Thread.sleep((1000*java.lang.Math.random()) toLong) besteck ! Put } private def denken { println(id+" denkt ...") Thread.sleep((1000*java.lang.Math.random()) toLong) println(" ... " + id + " hat zuende gedacht!") } } object Philosophen extends Application { val gabeln = for {i <- 1 to 5} yield new Gabel val namen = List( "Sokrates", "Descartes", "Kant", "Nietzsche", "Russell" ) for {p <- namen zipWithIndex} new Philosoph(p._1, new Besteck(gabeln(p._2), gabeln((p._2 + 1) % gabeln.size))) }