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

601-赵同学

发表文章数:191

热门标签

, ,
首页 » 大数据 » 正文


简单实现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!

未经允许不得转载:作者:601-赵同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《【Scala】代码实现Actor多种需求》 发布于2020-04-11

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录