持续接收消息
通过上一个案例,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) } }
结果: