环境:
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.