首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未编译的行为者示例

问未编译的行为者示例
EN

Stack Overflow用户
提问于 2013-12-13 15:15:00
回答 1查看 804关注 0票数 0

我试图运行这段代码来学习参与者(在Eclipse上使用Scala ),但是它告诉我,没有找到Ping和Pong值。

知道我做错了什么吗?

我安装了阿克卡。任何帮助都是非常感谢的。

谢谢

代码语言:javascript
复制
import scala.actors.Actor
import scala.actors.Actor._

class Ping(count: int, pong:Actor) extends Actor{ // type int here is not found as well
   def act(){
     var pingsLeft= count-1
     pong! Ping
      while(true){
        receive {
         case Pong =>
           if (pingsLeft % 1000 ==0)
             Console.println("Ping : pong ")
         if (pingsLeft > 0){
           pong ! Ping
           pingsleft -=1
         } else {
          Console.println("Ping : stop")
          pong ! Stop
          exit()
        }
      }
    }
  }
}

class Pong extends Actor {
  def act(){
    var pongCount =0
    while (true){
      receive {
        case Ping =>
          if(pongCount % 1000 ==0)
            Console.println("Pong : ping " + pongCount)
           sender ! Pong
           pongCount = pongCount + 1
        case Stop =>
          Console.println("Pong : stop")
          exit()
      }
    }
  }
 }

 object pingpong extends Application {
  val pong = new Pong
  val ping = new Ping(100000, pong)
  ping.start
  pong.start
}
EN

回答 1

Stack Overflow用户

发布于 2013-12-13 15:33:13

正如我在评论中指出的,您应该将示例切换到Akka。下面是重构为使用Akka的示例的粗略近似

代码语言:javascript
复制
import akka.actor._

class Ping(count: Int, pong:ActorRef) extends Actor{ // type int here is not found as well
  pong! Ping
  var pingsLeft = count - 1

  def receive = {
    case Pong =>
      if (pingsLeft % 1000 ==0)
        Console.println("Ping : pong ")
      if (pingsLeft > 0){
        pong ! Ping
        pingsLeft -=1
      } else {
        Console.println("Ping : stop")
        pong ! Stop
        context stop self    
    }
  }
}

class Pong extends Actor {
  var pongCount =0

  def receive = {
        case Ping =>
          if(pongCount % 1000 ==0)
            Console.println("Pong : ping " + pongCount)
           sender ! Pong
           pongCount = pongCount + 1
        case Stop =>
          Console.println("Pong : stop")
          exit()    
  }
 }

case object Ping
case object Pong
case object Stop

object pingpong {
  def main(args: Array[String]) {
    val system = ActorSystem("pingpong")
    val pong = system.actorOf(Props[Pong])
    val ping = system.actorOf(Props(classOf[Ping], 100000, pong))  
  }

}

他是一个稍微重构的版本,清理了一些可变的状态,并将Pong实例设置为Ping实例的子实例,这样当Ping停止时,它也会自动停止Pong实例:

代码语言:javascript
复制
import akka.actor._

class Ping(count: Int) extends Actor{ // type int here is not found as well
  val pong = context.actorOf(Props[Pong])
  pong! Ping

  def receive = pingReceive(count - 1)

  def pingReceive(pingsLeft:Int):Receive = {
    case Pong =>
      if (pingsLeft % 1000 ==0)
        Console.println("Ping : pong ")
      if (pingsLeft > 0){
        pong ! Ping
        context.become(pingReceive(pingsLeft - 1))
      } 
      else {
        Console.println("Ping : stop")
        context stop self    
      }        
  }
}

class Pong extends Actor {
  override def postStop{
    Console.println("Pong : stop") 
  }

  def receive = pongReceive(0)

  def pongReceive(pongCount:Int):Receive = {
    case Ping =>
      if(pongCount % 1000 ==0) 
        Console.println("Pong : ping " + pongCount)

      sender ! Pong
      context.become(pongReceive(pongCount + 1))        
  }
}

case object Ping
case object Pong

object PingPong {
  def main(args: Array[String]) {
    val system = ActorSystem("pingpong")
    val ping = system.actorOf(Props(classOf[Ping], 100000))  
  }    
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20569813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档