如何在演员 运行 时让程序暂停

how to make the program pause when actor is running

例如

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中有一个flag,当actor是运行时flag为false,当actor停止时flag为true,在main func中,有一个while循环,比如while (actor.flag == false) {},但是不行,是死循环:-/

所以,请多多指教。

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

Await.result(ping ? "ping")  

另外,创建actor最好使用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()

}