68.Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析


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讲 由王家林老师讲解


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值