69 lines
1.5 KiB
Scala
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)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|