当消息进入邮箱时,调度程序选择一个演员,恢复它并将其放在操作系统线程上。Java 线程与 OS 线程映射以执行执行。
Actor 将使用池中的一个线程并使用该线程进行消息处理并将线程释放到池中。
Actor 没有专用线程。有一个线程池,参与者将使用分配的线程来处理消息,一旦消息处理完成,线程将被释放。因此,Actor 与线程解耦。
现在让我们举个例子:
public class GreetingActor extends UntypedActor {
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
String sRmsg = (String) message;
businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
}
}
}
ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell("Charlie Parker");
在这里,greeter actor 使用 tell 方法发送消息,因此该消息将进入邮箱队列,调度程序将从队列中选择消息并使用该消息调用 actor。
当在 GreetingActor 的 'onReceive' 方法中接收到消息时-我的问题是演员使用的线程何时会被释放回池中-在 onReceive 方法中接收消息之后还是在执行 collectdata() 方法之后?
另外,“消息处理”表示什么?