You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.5 KiB
Scala

// http://www.scala-lang.org/node/54
package examples.actors
import scala.actors.Actor
import scala.actors.Actor._
abstract class PingMessage
case object Start extends PingMessage
case object SendPing extends PingMessage
case object Pong extends PingMessage
abstract class PongMessage
case object Ping extends PongMessage
case object Stop extends PongMessage
object pingpong extends Application {
val pong = new Pong
val ping = new Ping(100000, pong)
ping.start
pong.start
ping ! Start
}
class Ping(count: Int, pong: Actor) extends Actor {
def act() {
println("Ping: Initializing with count "+count+": "+pong)
var pingsLeft = count
loop {
react {
case Start =>
println("Ping: starting.")
pong ! Ping
pingsLeft = pingsLeft - 1
case SendPing =>
pong ! Ping
pingsLeft = pingsLeft - 1
case Pong =>
if (pingsLeft % 1000 == 0)
println("Ping: pong from: "+sender)
if (pingsLeft > 0)
self ! SendPing
else {
println("Ping: Stop.")
pong ! Stop
exit('stop)
}
}
}
}
}
class Pong extends Actor {
def act() {
var pongCount = 0
loop {
react {
case Ping =>
if (pongCount % 1000 == 0)
println("Pong: ping "+pongCount+" from "+sender)
sender ! Pong
pongCount = pongCount + 1
case Stop =>
println("Pong: Stop.")
exit('stop)
}
}
}
}