Выход из программы Scala перед выполнением и завершением всех отправляемых сообщений Scala Actor.Как это остановить? - PullRequest
1 голос
/ 10 марта 2011

Я отправляю своему Scala Actor свои сообщения из цикла for.Актер Scala получает сообщения и приступает к их обработке.Актеры выполняют задачи с интенсивным использованием процессора и диска, такие как разархивирование и хранение файлов.Я пришел к выводу, что актерская часть работает нормально, добавив задержку Thread.sleep(200) в мой код передачи сообщений в цикле for.

for ( val e <- entries ) {
  MyActor ! new MyJob(e)
  Thread.sleep(100)
}

Теперь моя проблема заключается в том, что программа завершает работу с кодом 0 в видекак только цикл for завершает выполнение.Таким образом мешая моим актерам закончить там работу.Как мне пройти через это?Это может быть действительно вопрос n00b.Любая помощь высоко ценится!

Редактировать 1: Это решило мою проблему на данный момент:

while(MyActor.getState != Actor.State.Terminated)
  Thread.sleep(3000)

Это лучшее, что я могу сделать?

1 Ответ

2 голосов
/ 11 марта 2011

Предположим, у вас есть один актер, которого вы хотите закончить свою работу.Чтобы избежать sleep, вы можете создать SyncVar и дождаться его инициализации в основном потоке:

val sv = new SyncVar[Boolean]

// start the actor
actor {
  // do something
  sv.set(true)
}

sv.take

Основной поток будет ждать, пока какое-либо значение не будет присвоено sv, а затемпроснитесь.

Если есть несколько актеров, то вы можете иметь несколько SyncVar с или сделать что-то вроде этого:

class Ref(var count: Int)

val numactors = 50
val cond = new Ref(numactors)

// start your actors
for (i <- 0 until 50) actor {
  // do something

  cond.synchronized {
    cond.count -= 1
    cond.notify()
  }
}

cond.synchronized {
  while (cond.count != 0) cond.wait
}
...