Есть некоторые проблемы с кодом. Прежде всего, не делайте этого:
object ActorApplication extends Application
Когда вы используете extends Application
, способ выполнения вашего кода налагает ряд ограничений, таких как невозможность оптимизации с помощью JIT и, что особенно важно для вашего случая, потоки не будут работать правильно. Мне сложнее объяснить, что произошло на 2.7.7, чем на 2.8. Вместо этого просто напишите обычный объект и определите метод main
.
Другие вещи:
gearController ! StartSync()
Не делай этого. Всегда отправляйте сообщение субъекту изнутри субъекта, и эта строка находится внутри конструктора ActorApplication
, который не является субъектом. В таких ситуациях вы можете сделать это:
Actor.actor { gearController ! StartSync() }
Говоря о StartSync
, не делайте этого:
case class StartSync
Класс без параметров не имеет смысла (и не рекомендуется). Вместо этого сделайте это:
case object StartSync
и опустите скобки после StartSync
в местах, где вы его используете.
Кроме того, нет ничего плохого в scala.util.Random
, хотя было проще неправильно использовать его в Scala 2.7, чем в Scala 2.8, создавая новый генератор Random
каждый раз, когда вам нужно случайное число (это то, что вы сделать в коде). Вместо этого в Scala 2.8 это должно сработать:
private var mySpeed = scala.util.Random.nextInt(1000)
Наконец, нет ничего плохого ни в одном исполнении, просто в планировщике есть различия между ними. Фактически, учитывая, что вы создали сотню актеров, GearController
получал непропорциональное количество времени выполнения в версии Scala 2.7, так как Scala не создает поток для каждого актера.
Теперь, если вы хотите, чтобы GearController
не делился потоком с другими, вы должны использовать while(true)
/ receive
вместо loop
/ react
, например:
while(true) {
receive {
case StartSync => {
Что даст результат, очень похожий на результат, полученный в 2.7.