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 Actor也至少必須掌握,這樣才能學習Spark源碼。多線程

一、Actor的建立、啓動和消息收發(案例:Actor Hello World)併發

// Scala提供了Actor trait來讓咱們更方便地進行actor多線程編程,就Actor trait就相似於Java中的Thread和Runnable同樣,是基礎的多線程基類和接口。咱們只要重寫Actor trait的act方法,便可實現本身的線程執行體,與Java中重寫run方法相似。 // 此外,使用start()方法啓動actor;使用!符號,向actor發送消息;actor內部使用receive和模式匹配接收消息 // 案例:Actor Hello World
object test{ def main(args: Array[String]): Unit = { import scala.actors.Actor //已棄用,改爲import akka.actor.Actor,需加模塊
    class HelloActor extends Actor { def act() { while (true) { receive { case name: String => println("Hello, " + name) } } } } val helloActor = new HelloActor helloActor.start() helloActor ! "leo" } }

 

二、收發case class類型的消息(案例:用戶註冊登陸後臺接口)框架

// Scala的Actor模型與Java的多線程模型之間,很大的一個區別就是,Scala Actor自然支持線程之間的精準通訊;即一個actor能夠給其餘actor直接發送消息。這個功能是很是強大和方便的。 // 要給一個actor發送消息,須要使用「actor ! 消息」的語法。在scala中,一般建議使用樣例類,即case class來做爲消息進行發送。而後在actor接收消息以後,可使用scala強大的模式匹配功能來進行不一樣消息的處理。 // 案例:用戶註冊登陸後臺接口
case class Login(username: String, password: String) case class Register(username: String, password: String) class UserManageActor extends Actor { 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")

 

三、Actor之間互相收發消息(案例:打電話)異步

import scala.actors.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) } } } object test{ def main(args: Array[String]): Unit = { val leo=new LeoTelephoneActor val jack=new JackTelephoneActor(leo) leo.start jack.start } }

 

四、同步消息和Future分佈式

// 默認狀況下,消息都是異步的;可是若是但願發送的消息是同步的,即對方接受後,必定要給本身返回結果,那麼可使用!?的方式發送消息。即val reply = actor !? message。 // 若是要異步發送一個消息,可是在後續要得到消息的返回值,那麼可使用Future。即!!語法。val future = actor !! message。val reply = future()。
相關文章
相關標籤/搜索