First, each actor waiting on receive
is occupying a thread. If it never receives anything, that thread will never do anything. An actor on react
does not occupy any thread until it receives something. Once it receives something, a thread gets allocated to it, and it is initialized in it.
Now, the initialization part is important. A receiving thread is expected to return something, a reacting thread is not. So the previous stack state at the end of the last react
can be, and is, wholly discarded. Not needing to either save or restore the stack state makes the thread faster to start.
There are various performance reasons why you might want one or other. As you know, having too many threads in Java is not a good idea. On the other hand, because you have to attach an actor to a thread before it can react
, it is faster to receive
a message than react
to it. So if you have actors that receive many messages but do very little with it, the additional delay of react
might make it too slow for your purposes.