Я полагаю, что Scala REPL использует System.exit (...), когда он завершает выполнение скрипта.Это остановит процесс, не дожидаясь каких-либо затяжных потоков.
Это означает, что все сообщения будут отправлены субъекту, но субъект не сможет обработать их вовремя.
Чтобы продемонстрировать, что вы можете попытаться добавить Thread.sleep (1000)для каждого из случаев в shape-actor.scala:
case s: Shape => Thread.sleep(1000);s.draw()
case "exit" => Thread.sleep(1000);println("exiting..."); exit
case x: Any => Thread.sleep(1000);println("Error: Unknown message! " + x)
Это, вероятно, приведет к сбою скрипта каждый раз (это происходит на моей машине).Если затем вы добавите Thread.sleep (5000) (что дает 2 секунды замедления), он должен выполняться каждый раз.
Решение состоит в том, чтобы использовать программу, которая не заканчивается в System.exit (...).
Обновление (считанные секунды):
Вы также можете настроить актера на уведомление о выходе:
case "exit" => Thread.sleep(1000);println("exiting..."); this.synchronized { this.notify }; exit
... и затемскрипт может ждать уведомления:
ShapeDrawingActor.synchronized { ShapeDrawingActor.wait(10000) }