scala.scala 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // http://www.scala-lang.org/node/54
  2. package examples.actors
  3. import scala.actors.Actor
  4. import scala.actors.Actor._
  5. abstract class PingMessage
  6. case object Start extends PingMessage
  7. case object SendPing extends PingMessage
  8. case object Pong extends PingMessage
  9. abstract class PongMessage
  10. case object Ping extends PongMessage
  11. case object Stop extends PongMessage
  12. object pingpong extends Application {
  13. val pong = new Pong
  14. val ping = new Ping(100000, pong)
  15. ping.start
  16. pong.start
  17. ping ! Start
  18. }
  19. class Ping(count: Int, pong: Actor) extends Actor {
  20. def act() {
  21. println("Ping: Initializing with count "+count+": "+pong)
  22. var pingsLeft = count
  23. loop {
  24. react {
  25. case Start =>
  26. println("Ping: starting.")
  27. pong ! Ping
  28. pingsLeft = pingsLeft - 1
  29. case SendPing =>
  30. pong ! Ping
  31. pingsLeft = pingsLeft - 1
  32. case Pong =>
  33. if (pingsLeft % 1000 == 0)
  34. println("Ping: pong from: "+sender)
  35. if (pingsLeft > 0)
  36. self ! SendPing
  37. else {
  38. println("Ping: Stop.")
  39. pong ! Stop
  40. exit('stop)
  41. }
  42. }
  43. }
  44. }
  45. }
  46. class Pong extends Actor {
  47. def act() {
  48. var pongCount = 0
  49. loop {
  50. react {
  51. case Ping =>
  52. if (pongCount % 1000 == 0)
  53. println("Pong: ping "+pongCount+" from "+sender)
  54. sender ! Pong
  55. pongCount = pongCount + 1
  56. case Stop =>
  57. println("Pong: Stop.")
  58. exit('stop)
  59. }
  60. }
  61. }
  62. }