Actor Model是用来编写并行计算或分布式系统的高层次抽象(类似java中的Thread)让程序员不必为多线程模式下共享锁而烦恼,被用在Erlang 语言上, 高可用性99.9999999 % 一年只有31ms 宕机Actors将状态和行为封装在一个轻量的进程/线程中,但是不和其他Actors分享状态,每个Actors有自己的世界观,当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-andforget),发送消息后不必等另外Actors回复,也不必暂停,每个Actors有自己的消息队列,进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统。
Actor的特征:
- ActorModel是消息传递模型,基本特征就是消息传递
- 消息发送是异步的,非阻塞的
- 消息一旦发送成功,不能修改
- Actor之间传递时,自己决定决定去检查消息,而不是一直等待,是异步非阻塞的
在使用Actor通信模型之前,需要添加对应的jar包:scala-actors.jar 下载地址,单击前往 添加jar包并且添加到环境当中。
随后创建代码:导入Actor包,使用一个class继承这个类,继承之后需要重写act方法,添加匹配。在main函数当中实例化一个对象,调用start方法进行启动,使用!进行发送消息。
package Actors
import scala.actors.Actor
class MyActor extends Actor{
override def act(): Unit = {
receive{
case s:String =>{println("type is String , s is " + s)}
case _=> {println("no match ...")}
}
}
}
object Actor1 {
def main(args: Array[String]): Unit = {
val actor = new MyActor()
actor.start()
//actor ! "hello changsha"
actor ! 100
}
}
单方面发送消息,在此,我们可以定义俩个class类,使其互发消息。
是用来一个样式类对发送消息的动作进行封装,封装发送给的那个对象和发送的消息。在里面的receive只会调用一次,所以在原先的基础上加上一个while循环始终调用,这个时候我们的case匹配的对象就不再是一个字符串类的值了,而是一个样式类的msg对象。
package Actors
import scala.actors.Actor
case class Msg(actor:Actor,msg: String){
}
//Actor之间的通信
class MyActor1 extends Actor{
override def act(): Unit = {
while(true){
receive{
case msg:Msg =>{println("type is String , s is " + msg.msg)
msg.actor ! " this is yueyue niao"
}
case _=> {println("no match ...")}
}
}
}
}
class MyActor2(actor:Actor) extends Actor{
actor ! Msg(this,"this is huang yueyue ...")
override def act(): Unit = {
while(true){
receive{
case s:String =>{println("type is String , s is " + s)}
case _=> {println("no match ...")}
}
}
}
}
object Actor2 {
def main(args: Array[String]): Unit = {
val actor1 = new MyActor1()
val actor2 = new MyActor2(actor1)
actor1.start()
actor2.start()
}
}