【Scala】代码实现Actor多种需求


简单实现Actor并发编程

import scala.actors.Actor
//todo 使用actor实现并发编程
class Actor1 extends Actor{
  override def act(): Unit = {
    for (i <- 1 to 10){
      println(s"actor1_$i")
      Thread.sleep(2000)
    }
  }
}

class Actor2 extends Actor{
  override def act(): Unit = {
    for (i <- 1 to 10){
      println(s"actor2_$i")
      Thread.sleep(2000)
    }
  }
}

object ActorTest{
  def main(args: Array[String]): Unit = {
    //创建Actor对象
    val actor1 = new Actor1
    val actor2 = new Actor2
    //启动actor
    actor1.start()
    actor2.start()
    //
  }
}
控制台结果

actor2_1
actor1_1
actor2_2
actor1_2
actor2_3
actor1_3
actor1_4
actor2_4
actor1_5
actor2_5
actor1_6
actor2_6
actor2_7
actor1_7
actor1_8
actor2_8
actor1_9
actor2_9
actor2_10
actor1_10

使用Actor实现发送没有返回值的异步消息

import scala.actors.Actor

class Actor3 extends Actor{
  override def act(): Unit = {
    //act内部使用receive,偏函数用于消息的接受处理
    receive{
      case "start" => println("正在启动>>>>>>>>>>>>>>")
    }

  }
}

object Actor3 {
  def main(args: Array[String]): Unit = {
    //创建Actor对象
    val actor = new Actor3
    //启动Actor
    actor.start()
    /*
    !	  发送异步消息,没有返回值。
    !?	发送同步消息,等待返回值。
    !!	发送异步消息,返回值是 Future[Any]。
     */
    //发送没有返回值的异步消息
    actor ! "start"
  }
}
控制台结果

正在启动>>>>>>>>>>>>>>

使用Actor实现不间断消息发送

import scala.actors.Actor

class Actor4 extends Actor {
  override def act(): Unit = {
    //利用while(true)实现持续不间断发送消息
    while (true) {
      receive {
        case "start" => println("正在启动>>>>>>>>>>>>")
        case "send" => println("发送中>>>>>>>>>>>>")
        //接收到"quit"字符串时,退出系统,中断循环
        case "quit" => System.exit(0)
      }
    }
  }
}

object Actor4 {
  def main(args: Array[String]): Unit = {
    //创建Actor对象
    val actor = new Actor4
    //启动Actor
    actor.start()
    //发送消息
    actor ! "start"
    actor ! "send"
    actor ! "quit"
  }
}
控制台结果

正在启动>>>>>>>>>>>>
发送中>>>>>>>>>>>>

Process finished with exit code 0

用react方法替代receive方法接收消息

import scala.actors.Actor

class Actor5 extends Actor{
  override def act(): Unit = {
    //利用react实现消息的接收,比receive效率更高,react方式会复用线程,避免频繁的线程创建、销毁和切换
    //如果要用react持续不间断接收,需要在外层加loop
    loop {
      react {
        case "start" => println("正在启动>>>>>>>>>>>>")
        case "send" => println("发送中>>>>>>>>>>>>")
        //接收到"quit"字符串时,退出系统,中断循环
        case "quit" => System.exit(0)
      }
    }
  }
}

object Actor5{
  def main(args: Array[String]): Unit = {
    //创建Actor对象
    val actor = new Actor5
    //启动Actor
    actor.start()
    //发送消息
    actor ! "start"
    actor ! "send"
    actor ! "quit"
  }
}
控制台结果

正在启动>>>>>>>>>>>>
发送中>>>>>>>>>>>>

结合case class,通过匹配不同的样例类执行不同操作

import scala.actors.{Actor, Future}

//异步消息样例类
case class AsyncMessage(id:Int,msg:String)
//回复消息样例类
case class ReplyMessage(msg:String)
//同步消息样例类
case class SyncMessage(id:Int,msg:String)


class Actor6 extends Actor{
  override def act(): Unit = {
    loop{
      react{
        case AsyncMessage(id,msg) => {
          println(s"id:$id=======msg:$msg")
          // 对于消息接收者,可以使用sender回复消息
          sender ! ReplyMessage("Roger that!")
        }
        case SyncMessage(id,msg) => {
          println(s"id:$id=======msg:$msg")
        }
      }
    }


  }
}

object Actor6{
  def main(args: Array[String]): Unit = {
    //创建Actor
    val actor = new Actor6
    //启动Actor
    actor.start()
    /*
    !	  发送异步消息,没有返回值。
    !?	发送同步消息,等待返回值。
    !!	发送异步消息,返回值是 Future[Any]。
     */
    //发送没有返回值的异步消息
    actor ! AsyncMessage(1,"This is AsyncMessage and no returned value.")

    //发送有返回值的异步消息
    //Futureb表示一个异步操作的结果状态,可能还没有实际完成的异步任务的结果
    val future: Future[Any] = actor !! AsyncMessage(2, "This is AsyncMessage and needs returned value.")
    //根据返回的状态提取最终的结果
    val replyMessage: ReplyMessage = future.apply().asInstanceOf[ReplyMessage]
    println(replyMessage)

    //发送同步消息
    actor !? SyncMessage(3,"This is SyncMessage!")

  }
}
控制台结果

id:1=======msg:This is AsyncMessage and no returned value.
id:2=======msg:This is AsyncMessage and needs returned value.
ReplyMessage(Roger that!)
id:3=======msg:This is SyncMessage!
posted @ 2020-04-11 16:56  _codeRookie  阅读(269)  评论(0编辑  收藏  举报