过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单,一旦您开始看到性能改进,它就会变得非常有趣。 但是,当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时,或者当您的探查器显示您的线程花费大量时间阻塞时,它会感到疼痛在写入共享状态之前浪费时间。
我不想谈论Java并发API及其集合如何使其变得更好和更容易,因为我确定如果您在这里,您可能需要对子任务进行更多控制,或者仅仅是因为您不喜欢编写锁和同步块,并希望更高层次的抽象。
在本系列的Akka Notes中,我们将通过简单的Akka示例来探索工具包中的各种功能。
什么是演员?
Akka的演员遵循演员模型 (duh!)。
像演员一样对待演员。 不亲自交谈的人。 他们只是通过邮件交谈。
让我们对此进行扩展。
1.消息传递
考虑两个人–一个明智的老师和学生。 学生每天早上都会向老师发送一封邮件,而明智的老师会发回明智的报价。
注意事项:
- 学生发送邮件。 一旦发送,邮件将无法编辑。 谈论自然不变性。
- 老师在需要时检查他的邮箱。
- 教师还会发回邮件(再次不变)。
- 学生可以自己检查邮箱。
- 学生不用等待答复。 (无阻塞)
这几乎总结了Actor模型的基本组成部分-传递消息。
2.并发
现在,假设有3位明智的老师和3位学生–每个学生都会向其他老师发送笔记。 那会发生什么呢? 实际上没有任何变化。 每个人都有自己的邮箱。 这里需要注意的一个细微之处是:
默认情况下,邮箱中的邮件按照到达的顺序进行读取/处理。
在内部,默认情况下是ConcurrentLinkedQueue 。 而且由于没有人等待邮件被提取,因此它只是一个无阻塞的消息。 (有多种内置邮箱,包括有界邮箱和基于优先级的邮箱 。实际上,我们也可以自己构建邮箱 )
3.故障转移
想象一下,这三位老师来自三个不同的部门-历史,地理和哲学。
历史老师回覆过去的事件记录,地理老师则寄给我一个有趣的地方,哲学老师则引述一段话。 每个学生向每个老师发送消息并获得答复。 学生不在乎该部门的哪个老师发回答复。 如果有一天老师生病怎么办? 必须至少有一位老师来处理部门的邮件。 在这种情况下,该部门的另一位老师会加强工作。
注意事项:
- 可能会有一群演员在做不同的事情。
- 演员可能会做一些导致异常的事情。 它无法自行恢复。 在这种情况下,可以
created
一个新的Actor来代替旧的Actor。 另外,Actor可以忽略该一条特定消息,然后继续处理其余消息。 这些称为指令,我们将在后面讨论。
4.多任务
有所不同的是,假设这些教师中的每一个也都通过邮件发送考试成绩(如果学生要求的话)。 同样,演员可以舒适地处理多种type
的消息。
5.链接
如果学生只想收到一封最终的综合琐事邮件而不是三封怎么办?
我们也可以通过Actors做到这一点。 我们可以将教师链接为一个层次结构。 稍后我们将讨论主管,然后再回到有关期货的话题。
按照Mohan的要求,让我们尝试将类比组件与Actor模型中的组件进行映射。
学生和老师成为我们的Actors
。 电子邮件收件箱将成为Mailbox
组件。 请求和响应无法修改。 它们是immutable
对象。 最后,Actor中的MessageDispatcher
组件管理邮箱并将消息路由到相应的Mailbox
。
聊够了,让我们编写一些代码…。
翻译自: https://www.javacodegeeks.com/2014/09/akka-notes-introducing-actors.html