//Beispiel: parallele Primzahlberechnung fuer das Informatikseminar im WS 09/10 der fhwedel //Scala: Nebenlaeufigkeit und paralleles Rechnen //parallele Primzahlsberechnung nach dem Vorbild von Prof. Schmidts Vorlage aus der Vorlesung OOP in Java //implementiert in Scala mit Hilfe von Actors //von Henning Reimer object primes { import scala.actors.Actor._ import scala.actors.Actor case class Start(von : Long, bis : Long, max : Long) case class Work() class PrimeAct(von : Long, bis : Long) extends Actor { def isPrime(n:Long) : Boolean = { var i : Long = 2 if (n <= 1) false else { while ( n % i != 0 && i * i <= n) i += 1 i * i > n } } def count(von : Long, bis : Long) : Long = { var anz : Long = 0 var i : Long = von while (i <= bis){ if (isPrime(i)) anz += 1 i += 1 } anz } def act() { react { case work : Work => sender ! count(von,bis) } } } class Coordinate extends Actor { var done : Boolean = false var actCount : Int = 0 var count : Long = 0 def splitWork(von : Long, bis : Long, max : Long) { if (bis - von <= max) { val counter = new PrimeAct(von,bis).start() counter ! Work() actCount += 1 } else { val counter = new PrimeAct(von, von + max - 1).start() counter ! Work() actCount += 1 splitWork(von + max, bis, max) } } def act() { while(!done) { receive { case start : Start => splitWork(start.von, start.bis, start.max) println("Es werden " + actCount + " Actors zur Berechnung verwendet.") case msg : Long => count += msg actCount -= 1 done = actCount == 0 } } println("Anzahl Primzahlen: " + count) exit() } } def main(args : Array[String]){ val coord = new Coordinate().start() try { coord ! Start(args(0).toLong,args(1).toLong,args(2).toLong); } catch { case ex => println("Falsche Parameter. Nehme Standardwerte (1, 1000, 500).") coord ! new Start(1,1000,500); } } }