1. 调用start()方法启动Actor
  2. 自动执行act()方法
  3. 向Actor发送消息
  4. act方法执行完成后,程序会调用exit()方法结束程序执行.

    发送信息

    使用如下三种方式来发送消息:
发送异步消息,没有返回值
!? 发送同步消息,等待返回值
!! 发送异步消息,返回值是Future[Any]
  1. actor1 ! "要发送的消息"

接收信息

Actor中使用receive方法来接收消息,需要给receive方法传入一个偏函数
receive方法只接收一次消息,接收完后继续执行act方法

  1. {
  2. case 变量名1:消息类型1 => 业务处理1,
  3. case 变量名2:消息类型2 => 业务处理2,
  4. ...
  5. }
  1. import scala.actors.Actor
  2. import scala.actors.threadpool.TimeUnit
  3. object Test03 {
  4. //创建两个Actor(ActorSender、ActorReceiver)
  5. //ActorSender发送一个异步字符串消息给ActorReceiver
  6. object ActorSender extends Actor {
  7. override def act(): Unit = {
  8. //持续发送信息
  9. while (true){
  10. ActorReceiver ! "hello"
  11. //发送信息后程序停止3秒
  12. TimeUnit.SECONDS.sleep(3)
  13. }
  14. }
  15. }
  16. object ActorReceiver extends Actor {
  17. override def act(): Unit = {
  18. //持续接收消息
  19. while (true) {
  20. //ActorReceive接收到该消息后,打印出来
  21. receive {
  22. case msg:String => println("接收到的消息:" + msg)
  23. }
  24. }
  25. }
  26. }
  27. def main(args: Array[String]): Unit = {
  28. //调用
  29. ActorReceiver.start()
  30. ActorSender.start()
  31. }
  32. }

结果
image.png

持续接收消息

上述代码示例中,使用while(true) 构建一个死循环来接收信息

  • 如果当前Actor没有接收到消息,线程就会处于阻塞状态
  • 如果有很多的Actor,就有可能会导致很多线程都是处于阻塞状态>
  • 每次有新的消息来时,重新创建线程来处理
  • 频繁的线程创建、销毁和切换,会影响运行效率

在scala中,可以使用loop + react来复用线程。比while + receive更高效

  1. //持续接收消息
  2. loop {
  3. react {
  4. case msg: String => println("接收到的消息:" + msg)
  5. }
  6. }
  1. import scala.actors.Actor
  2. object Test04 {
  3. //创建两个Actor(ActorSender、ActorReceiver)
  4. //ActorSender发送一个异步字符串消息给ActorReceiver
  5. object ActorSender extends Actor {
  6. override def act(): Unit = {
  7. //发送信息
  8. while (true) {
  9. ActorReceiver ! "hello"
  10. TimeUnit.SECONDS.sleep(3)
  11. }
  12. }
  13. }
  14. object ActorReceiver extends Actor {
  15. override def act(): Unit = {
  16. //持续接收消息 优化
  17. loop {
  18. react {
  19. case msg: String => println("接收到的消息:" + msg)
  20. }
  21. }
  22. }
  23. }
  24. def main(args: Array[String]): Unit = {
  25. //调用
  26. ActorReceiver.start()
  27. ActorSender.start()
  28. }
  29. }