All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalaz.example.concurrent.PingPong.scala Maven / Gradle / Ivy

package scalaz.example
package concurrent

import scalaz._
import scalaz.concurrent._

import java.util.concurrent._
import scalaz.concurrent._
import scalaz.Scalaz._

object PingPong {
  val actors = 10000
  val pings = 3
  implicit val pool = Executors.newFixedThreadPool(5)
  implicit val s = strategy.Executor.strategy[Unit]

  class Pong
   { val p: Actor[Ping] = actor((m: Ping) => m.p ! Pong.this) }

  class Ping(pings: Int, pong: Pong, cb: Actor[Ping])
   { var n = pings
     val p: Actor[Pong] = actor((m: Pong) =>
      { n = n - 1
        if (n > 0) pong.p ! Ping.this else cb ! Ping.this })
     def start = pong.p ! this }

  @volatile var done = 0
  val callback = actor((p: Ping) =>
   { done = done + 1
     if (done % (actors / 10) == 0) 
       println(done + " actors done -- " + pings * done + " total pongs.")
     else () 
     if (done >= actors) {
      println("All done.")
      pool.shutdown
    } else ()
  })

  def run {
    (1 to actors).foreach(i => {
      val pong = new Pong
      (new Ping(pings, pong, callback)).start
      if (i % (actors / 10) == 0)
        println(i + " actors started.")
      else ()
    })
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy