Actor内置状态转换
在很多情况下Actor的业务逻辑可能比较复杂,Actor可能需要根据不同的状态对同一条消息作出不同的处理。一个Actor内部消息处理函数可以拥有多个不同的状态,在特定状态下,可以对同一消息进行不同的处理,状态之间也可以任意切换。
BabyActor WatchActor main及运行结果当BabyActor收到消息时,系统会调用onReceive()处理消息,然后做状态切换。一旦完成状态切换,后续有新的消息时,就不会再由onReceive()处理消息了,而是由angry和happy直接处理(因为angry和happy本身就是消息处理函数),这样就封装了Actor的多个不同的处理逻辑。
询问模式:Actor中的Future
由于Actor之间都是通过异步消息来通信的,当发送一条消息给Actor后,通常只能等待其返回结果。与异步方法不同,在你发送异步消息后,接收消息的Actor可能还没处理消息,而调用方就已经返回了。此模式与Future模式很类似,不同点是在传统异步调用中需要用函数调用,而Actor中只是发送了一条消息。
Worker及Printer的Actor定义 WatchActor main方法及运行结果多个Actor同时修改数据:Agent
Akka使用Agent组件来实现多个Actor对同一共享变量进行读写功能。一个Agent提供了对一个变量的异步更新,当一个Actor想改变Agent的值时,它会向Agent下发一个动作(action)。当多个Actor同时改变Agent时,这些action将会在ExecutionContext中被并发调度执行。在任意时刻,一个Agent最多只能执行一个action,对于某个线程来说,它执行action的顺序与它的发生顺序一致,对不同线程来说,这些action可能会交织在一起。
Agent的修改可以使用send()和alter()方法。它们都可以向Agent发送一个修改动作,send()无返回值,alter()会返回一个Future对象用于跟踪Agent的执行。
场景:用10个Actor一起对一个Agent执行累加操作,每个Actor累加1000次,若执行正确将得到10000,否则值可能小于10000;
累加器Actor main方法及运行结果--参考文献《实战Java高并发程序设计》
网友评论