scala的Actor持续接收消息

持续接收消息
通过上一个案例,ActorReceiver调用receive来接收消息,但接收一次后,Actor就退出了。

object ActorSender extends Actor {
  override def act(): Unit = {
    // 发送字符串消息给Actor2
    val msg =  "你好,ActorSender"
    println(s"ActorSender: 发送消息$msg")

    ActorReceiver ! msg
    // 再次发送一条消息,ActorReceiver无法接收到
    ActorReceiver ! "你叫什么名字?"
  }
}

object ActorReceiver extends Actor {
  override def act(): Unit =
    receive {
      case msg: String => println(s"接收Actor: 接收到$msg")
    }

}

object ActorMsgDemo {
  def main(args: Array[String]): Unit = {
    ActorSender.start()
    ActorReceiver.start()
  }
}

上述代码,ActorReceiver无法接收到ActorSender发送的第二条消息。
我们希望ActorReceiver能够一直接收消息,怎么实现呢?
——我们只需要使用一个while(true)循环,不停地调用receive来接收消息就可以啦。
示例
示例说明
在上一个案例的基础上,让ActorReceiver能够一直接收消息

  object ActorSender extends Actor {
    override def act(): Unit = {
      // 发送消息
      while(true) {
        ActorReceiver ! "hello!"
        TimeUnit.SECONDS.sleep(3)
      }
    }
  }

  object ActorReceiver extends Actor {
    override def act(): Unit = {
      // 持续接收消息
      while(true) {
        receive {
          case msg:String => println("接收到消息:" + msg)
        }
      }
    }
  }

  def main(args: Array[String]): Unit = {
    ActorReceiver.start()
    ActorSender.start()
  }

在这里插入图片描述
结果:
在这里插入图片描述
使用loop和react优化接收消息
上述代码,使用while循环来不断接收消息。
如果当前Actor没有接收到消息,线程就会处于阻塞状态
如果有很多的Actor,就有可能会导致很多线程都是处于阻塞状态
每次有新的消息来时,重新创建线程来处理
频繁的线程创建、销毁和切换,会影响运行效率
在scala中,可以使用loop + react来复用线程。比while + receive更高效
示例
示例说明
使用loop + react重写上述案例
参考代码:
// 持续接收消息
loop { react { case msg:String => println("接收到消息:" + msg) } }
在这里插入图片描述
结果:
在这里插入图片描述

发布了158 篇原创文章 · 获赞 339 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/qq_45765882/article/details/104336327