Scala併發編程持續接收消息

持續接收消息

通過上一個案例,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)
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章