标签:test trouble stat xtend 存储 time 参考 com 之间
在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成
以下通过学生与教师之间的邮件通信来理解akka中的Actor模型
首先先只考虑学生单向发送消息给教师(学生--->教师),如下图:
图解:
下面再详细的解释每一步骤
首先StudentSimulatorApp会先启动JVM并初始化ActorSystem
如上图所示,StudentSimulatorApp的主要工作为:
ActorSystem作为顶级Actor,可以创建和停止Actors,甚至可关闭整个Actor环境,
此外Actors是按层次划分的,ActorSystem就好比Java中的Object对象,Scala中的Any,
是所有Actors的根,当你通过ActorSystem的actof方法创建Actor时,实际就是在ActorSystem
下创建了一个子Actor。
可通过以下代码来初始化ActorSystem
val system = ActorSystem("UniversityMessageSystem")
看看TeacherActor的代理的创建代码
val teacherActorRef:ActorRef = system.actorOf(Props[TeacherActor])
你只需通过!方法将QuoteReques消息发送给ActorRef(注意:ActorRef也有个tell方法,其作用就委托回调给!)
techerActorRef!QuoteRequest
等价于teacherActorRef.tell(QuoteRequest, teacherActorRef)
完整StudentSimulatorApp代码
object StudentSimulatorApp extends App{
?//初始化ActorSystem
?val actorSystem=ActorSystem("UniversityMessageSystem")
?//构建teacherActorRef
?val teacherActorRef=actorSystem.actorOf(Props[TeacherActor])
?//发送消息给TeacherActor
?teacherActorRef! QuoteRequest
?Thread.sleep (2000)
?//关闭 ActorSystem,如果不关闭JVM将不会退出
?actorSystem.shutdown()
}
object TeacherProtocol{
?case class QuoteRequest() //请求
?case class QuoteResponse(quoteString:String) //响应
}
ActorRef将消息处理能力委派给Dispatcher,实际上,当我们创建ActorSystem和ActorRef时,
Dispatcher和MailBox就已经被创建了
Dispatcher从ActorRef中获取消息并传递给MailBox,Dispatcher封装了一个线程池,之后在
线程池中执行MailBox。
protected[akka] override def registerForExecution(mbox: Mailbox, ...): Boolean = {
? ...
?try {
?executorService execute mbox
?...
}
看看MailBox的实现,没错,其实现了Runnable接口
private[akka] abstract class Mailbox(val messageQueue: MessageQueue) extends SystemMessageQueue with Runnable
当ActorRef发送消息调用目标Actor的reveive方法时,MailBox中的run方法被执行,接着从消息队列中取出一条消息并传递给Actor处理
class TeacherActor extends Actor {
?val quotes = List(
??"Moderation is for cowards",
??"Anything worth doing is worth overdoing",
??"The trouble is you think you have time",
??"You never gonna know if you never even try")
?def receive = {
??case QuoteRequest => {
??import util.Random
??//从list中随机选出一条消息作为回应(这里只print并没回应学生的请求)
??val quoteResponse=QuoteResponse(quotes(Random.nextInt(quotes.size)))
??println (quoteResponse)
??}
?}
}
TeacherActor的receive方法将匹配QuoteRequest消息
参考文章:
https://rerun.me/tag/akka/page/2/
标签:test trouble stat xtend 存储 time 参考 com 之间
原文地址:https://www.cnblogs.com/barrywxx/p/10284319.html