package ce.scala.zhong
//6
import scala.actors.Actor
import scala.actors.Actor._
//用case class 或者case object作为消息来传递,有两个原因:
//1.参数是val类型的,在传输过程中不会改变。2.接收消息时,模式匹配+case class,极大简化了代码的处理(比如下面的name和age可以很轻松地提取出来)
case class Personzz(name : String, age : Int)
class HelloActor extends Actor{
def act(){
while(true){
receive{
//actor运行在单个线程中,它会先接收一条消息,然后再接收下一条消息。
case Personzz(name, age) => {
println(name + " " + age);
sender ! "Echo!!" //sender关键字:sender就是main方法所在线程的Actor。可以给发送者回一条消息,就像回邮件一样。对有界面的编程很重要。
}
//这里,处理完成后,最好不要把结果交给全局对象,一律应当把计算结果以消息传递的方式传递给其他数据的消费者。
//如果receive不能处理消息,那么邮箱会被无关的消息占满,用case _ 来处理无关的消息。
case _ => {println("something else");}
}
}
}
}
//消息发送本身是异步的,什么时候到达HelloActor邮箱也是没有保证的,所以我们写程序时不要依赖于消息被传递来的顺序。
object Actor_With_Caseclass_68 {
def main(args: Array[String]): Unit = {
val hiActor = new HelloActor
hiActor.start()
hiActor ! Personzz("Spark", 6)
//self:把线程当Actor使用。接收其他线程给主线程发送的消息。eg:更新用户界面,响应用户事件。具体的操作交给其他Actor子线程来处理。
self.receive{case msg => println("nihao = " + msg)}
self.receiveWithin(1000)({case msg => println(msg)})
}
}
输出:
Spark 6
nihao = Echo!!
参考资料来源于大数据梦工厂 深入浅出scala 第68讲 由王家林老师讲解