Es kommt darauf an. Wenn Sie eine Nachricht aus einem Nicht-Schauspieler-Code an einen Akteur senden, wird automatisch ein ActorProxy erstellt und in einem lokalen Thread gespeichert. Dies erzeugt ein potentielles Speicherleck, wenn auch ein sehr kleines, da der ActorProxy erst dann GC'd wird, wenn der Thread GC'd ist. Der ActorProxy ermöglicht im Wesentlichen, dass sich der Nicht-Akteur-Thread in vielerlei Hinsicht wie ein Actor verhält, einschließlich dem Empfangen von Nachrichten. Das größere Problem ist, wenn Ihr Thread verwaltet wird, ähnlich wie die Akteur-Bibliothek Threads verwaltet, so dass sich das, was einen logischen Kontext darstellt, zu einem Zeitpunkt in einem Thread und zu einem anderen Zeitpunkt in einem anderen Thread befinden kann. Ein gutes Beispiel dafür wäre ein Servlet-Container. Ihr logischer Kontext kann ein Servlet oder eine Sitzung sein, aber der ActorProxy wird an den Thread gebunden und somit in logischen Kontexten geteilt. Wenn Ihre Akteure nicht auf ActorProxy antworten, ist das keine so große Sache, aber wenn sie es sind, wird es wahrscheinlich zu Problemen führen, weil entweder (a) die Antworten möglicherweise durch den falschen Kontext erhalten werden oder (b) die Nachrichten werden nie empfangen, und daher wird das zuvor erwähnte kleine Leck zu einem großen, wenn die Postfächer der ActorProxies voll werden.
[Bearbeiten] Hmm ... Ich habe ein Problem beim Lesen von Fragen! Wenn Sie ihn im Actor-Block umgeben, wird ein neues Actor-Objekt erstellt, das beim Beenden ordnungsgemäß gecodiert wird. Beachten Sie, dass das Senden der Nachricht in einen Actor-Block bedeutet, dass die Nachricht in einer neuen Reaktion auf einen anderen Thread gesendet wird, nicht in dem Thread, der den Actor erstellt.
Große Antwort, Eric, danke. Hat das Umbrechen des Aufrufs in einen Block "actor {}" (wie in meiner Frage) das gleiche Problem? Oder ist der erstellte Akteur GC-fähig, wenn der Block endet, unabhängig davon, ob der Thread weiterlebt? –