Scala Actor 异步发送无返回 同步发送 异步发送有返回

环境:

Intellij2018+Scala2.10.6

 

前言:

! 表示异步发送没有返回值

!? 同步发送,有返回值

!! 异步发送,有返回值,类型是Future[Any]

 

一、异步发送无返回

class TestActor3 extends  Actor{
  override def act(): Unit = {
    while (true){
      receive{//偏函数应用
        case "hello"=>println("hello")
        case AsyncMsg(id:Int,msg:String)=>println(s"异步====接受到的值为====id:$id,name :$msg")//AsyncMsg后面的参数是否要加类型,加不加都行
          sender ! ReplyMsg(30,"异步====返回值为 :i am 化腾")
        case SyncMsg(id,msg)=>{
          println(s"同步==接受到的值为====id:$id,name :$msg")
          sender ! ReplyMsg(30,"同步==返回的值为====id :i am 马云")
        }
        case _=> println("None matched")//任意匹配
      }
    }
  }
}

解释:

创建一个Actor

利用receive接受,入参是一个偏函数

2、main函数中发送

object  TestActor3{
  def main(args: Array[String]): Unit = {
    val actor3: TestActor3 = new TestActor3
    actor3.start()
    //异步发送成功
    actor3 ! AsyncMsg(1,"syn msg")
    Thread.sleep(4000)
    println("异步====[不需要返回]====发送====成功")
  }
}

注意:可以将睡眠去掉,观察效果。发现会先打印main里面的Println.

3、元数据case class

case class SyncMsg(id:Int,msg:String)
case class AsyncMsg(id:Int,msg:String)
case class ReplyMsg(id:Int,msg:String)

二、同步发送

object  TestActor3{
  def main(args: Array[String]): Unit = {
   val syncResult: Any = actor3 !? SyncMsg(2,"async msg")
    println("同步====接受====返回值成功"+syncResult)
  }
}

三、异步发送有返回值

val aSyncResult: Future[Any] = actor3 !! AsyncMsg(4,"东方不败")
    Thread.sleep(5000)
    if(aSyncResult.isSet){
      val value: Any = aSyncResult.apply()
      println("异步====[需要返回]====接受====成功,值为:"+value)
    }else{
      println("None matched333...")
    }

注意:可以将睡眠去掉,观察效果。发现会先打印main里面的Println.

转载于:https://my.oschina.net/windows20/blog/1799070

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值