持續接收消息
通過上一個案例,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)
}
}