zoukankan      html  css  js  c++  java
  • 【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!
    
  • 相关阅读:
    解析HTTP协议六种请求方法
    金蝶
    普元
    中间件
    [CTSC2008] 网络管理
    【Uva 10498】满意值
    【SPOJ839】最优标号
    bzoj2879 [Noi2012]美食节
    bzoj3144 [Hnoi2013]切糕
    bzoj3112 [Zjoi2013]防守战线
  • 原文地址:https://www.cnblogs.com/zzzsw0412/p/12772400.html
Copyright © 2011-2022 走看看