Scala的Actor入门

Scala的Actor类似于Java中的多线程问题。但是不同的是,Scala的Actor提供的模型与多线程有所不同。 Scala的Actor尽可能的避免锁和共享的状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能。此外,Scala Actor的这种模型还可以避免死锁等一系列传统多线程编程的问题。

Spark中使用的分布式多线程框架,是Akka,Akka也实现了类似Scala Actor的模型,其核心概念同样也是Actor。因此只要掌握了Scala 的Actor,那么在Spark源码研究室。至少即可看明白Akka Actor相关的代码。但是换一句话说,由于Spark内部有大量的Akka  Actor的使用​​,因此对于Scala Aactor也至少必须掌握,这样才能学习Spark源码

- 1. Actor的创建,启动和消息收发

Scala提供了Actor特质来让我们更方便的进行Actor多线程编程,Actor特征就类似于Java中的Thread和Runnable一样,是基础的多线程基类和接口。我们只要重写Actor特质的行为方法,与Java的中重写运行方法类似。
 

此外,使用start()方法启动actor,使用!符号,向Actor发送消息,Actor内部使用receice和模式匹配接受消息

// 案例:Actor Hello World
import scala.actors.Actor

class HelloActor extends Actor{
  def act(){
    while(true){
	  receive {
	    case name:String => println("Hello, " +name)
	  }
	}
  }
}
val  helloActor=new HelloActor
helloActor.start()
helloActor !"leo"

代码展示如下:

Scala的Actor入门_第1张图片

- 2.收发案例类类型的消息

Scala的Actor模型与Java的多线程模型之间,很大的一个区别就是,Scala Actor天然支持线程之间的精准通信,即一个Actor可以给其他Actor直接发送消息。这个功能是非常强大和方便的

 要给一个Actor发送消息,需要使用“Actor!消息”的语法,在scala中,通常建议使用样例类,即案例类作为消息进行发送。然后在Actor接受消息之后,可以使用scala强大的模式匹配功能来进行不同消息的处理。

代码展示如下:

//案例:用户注册登录后台接口
 case class Login(username:String,password:String)
 case class Register(username:String,password:String)
 class UserManageActor extends Aactor{
  def act(){
   while(true){
    receive {
	 case Login(username,password)=> println("login, username is "+ username+" , password is "+password)
	 case Register(username,password)=> println("register , username is "+username+" , password is " +password)
	}
   }
  }
 }
 val userManageActor=new UserManageActor
 userManageActor.start()
 userManageActor !Register("leo","1234");userManageActor !Login("leo","1234")

 - 3.Actor之间相互发消息

 如果两个Actor之间要互相发消息,那么Scala的建议是,一个Actor向另一个Actor发送消息时,同时带上自己的引用。其它Actor收到自己的消息时,直接通过发送消息的Actor的引用,既可以给它回复消息。

//案例: 打电话
 case class Message(content :String,sender:Actor)
 class LeoTelephoneActor extends Actor{
   def act(){
     while(true){
	   receive{
	    case Message(content,sender) =>{println("leo telephone: "+content);sender !"I'm leo, please call me after 10 minutes. " }
	   }
	 }
   }
 }
 class JackTelephoneActor (val leoTelephoneActor:Actor) extends Actor{
   def act(){
     leoTelephoneActor !Message("Hello , Leo ,I'm Jack." ,this)
	 receive{
	  case response:String => println("jack telephone: " +response)
	 }
   }
 }

未完待续......

你可能感兴趣的:(大数据,Scala)