メッセージがメールボックスに届くと、スケジューラはアクターを選択し、再開して OS スレッドに配置します。Java スレッドは OS スレッドにマップされて実行されます。
アクターはプールから 1 つのスレッドを使用し、このスレッドをメッセージ処理に使用して、スレッドをプールに解放します。
アクターには専用スレッドがありません。スレッドのプールがあり、アクターは割り当てられたスレッドを使用してメッセージを処理し、メッセージの処理が完了するとスレッドが解放されます。そのため、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 アクターは tell メソッドを使用してメッセージを送信します。したがって、このメッセージはメールボックス キューに入れられ、スケジューラーはキューからメッセージを選択し、メッセージでアクターを呼び出します。
メッセージが GreetingActor の「onReceive」メソッドで受信されたとき - 私の質問は、アクターが利用したスレッドがプールに解放されるのはいつですか? onReceive メソッドでメッセージを受信した後、または collectdata() メソッドの実行後ですか?
また、「メッセージ処理」は何を示していますか?