scala的Actor类似于java中的多线程编程,scala中的Actor尽可能的避免锁和共享状态,从而避免多线程并发时出现资源争夺的情况,进而提升多线程编程的性能。
spark中使用的分布式多线程框架为Akka,核心是actor。
1. actor的创建、启动和消息收发
scala提供了Actor trait用于多线程编程,类似于java中的Thread和Runnable,通过实现Actor trait的act方法,即可实现线程执行体。
使用start()启动actor;使用!向actor发送消息;actor内部使用receive和模式匹配接收消息。
import scala.actors.Actor
object Score extends App {
class HelloActor extends Actor{
def act(): Unit ={
while(true){
receive{
case name: String => println(name)
}
}
}
}
val helloActor = new HelloActor
helloActor.start()
helloActor !"leo"
}
2.收发case class 类型的消息
scala的actor模型与java模型之间的一个区别是,scala actor支持线程间的通信,即一个actor可以给另一个actor发送消息。
要给一个actor发送消息使用actor ! message 的语法。在scala中,通常使用case class 作为消息的传递,在actor中使用模式匹配的不同消息做不同处理
import scala.actors.Actor
object Score extends App {
case class Login(username: String, password: String)
case class Register(username: String, password: String)
class UserManageActor extends Actor{
def act(): Unit ={
while(true){
receive{
case Login(username, password)=>println("login,username: "+ username)
case Register(username, password) => println("register ")
}
}
}
}
val userManageActor = new UserManageActor
userManageActor.start()
userManageActor ! Register("cys","123")
userManageActor ! Login("joe","123")
}
3.Actor之间互相收发消息
一个actor向另一个actor发送消息时,同时带上自己的引用;其他actor收到自己的消息时,直接通过发送消息的actor引用,即可回复消息。
case class Message(content: String,sender: Actor)
class cysTelephoneActor extends Actor{
def act(): Unit ={
while (true){
receive{
case Message(content, sender) => println("cys: "+ content);sender ! "wait 5 seconds"
}
}
}
}
class joeActor(val cysActor: Actor) extends Actor{
def act: Unit ={
cysActor ! Message("Hello, joe, I'm cys.", this)
receive{
case response: String => println("joe: " + response)
}
}
}
val cysActor = new cysTelephoneActor
cysActor.start()
val joeActor = new joeActor(cysActor)
joeActor.start()
4. 同步消息和Future
默认情况下消息是异步的,但如果希望发送的消息是同步的,即对方接收消息后一定要返回结果,那么可以使用!? 发送消息。
即val reply = actor !? message
如果要发送异步消息,但后续要接收消息返回值使用 !! 。val fulture = actor !! message;val replay = future()