当actor运行时如何使程序暂停

时间:2015-06-12 02:19:36

标签: multithreading scala parallel-processing actor

例如

import scala.actors.Actor
import scala.actors.Actor._

object Main {
  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()
        }
      }
    }
  }

  class Ping(count: Int, pong: Actor) extends Actor {
    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()
            }
        }
      }
    }
  }

  def main(args: Array[String]): Unit = {
    val pong = new Pong
    val ping = new Ping(100000, pong)
    ping.start
    pong.start
    println("???")
  }

}

我尝试打印“???”在两个演员调用exit()之后,现在它在“Ping:Stop”和“Pong stop”之前打印

我尝试在actor中有一个标志,当actor运行时flag是false,当actor停止时flag是true,而在main func中,有一个while循环,例如while (actor.flag == false) {},但是它不起作用,它是一个无限循环: - /

所以,请给我一些建议。

1 个答案:

答案 0 :(得分:0)

如果您需要在akka中进行同步调用,请使用ask模式。喜欢

Await.result(ping ? "ping")  

另外,你最好使用actor系统来创建演员。

import akka.actor.{ActorRef, Props, Actor, ActorSystem}
import akka.pattern.ask
import akka.util.Timeout

import scala.concurrent.Await
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

object Test extends App {

  implicit val timeout = Timeout(3 second)
  val system = ActorSystem("ActorSystem")

  class Pong extends Actor {
    def receive: Receive = {
      case "Ping" =>
        println("ping")
        context.stop(self)
    }
  }

  lazy val pong = system.actorOf(Props(new Pong), "Pong")

  val x = pong.ask("Ping")
  val res = Await.result(x, timeout.duration)
  println("????")
  system.shutdown()

}