Актеры Scala: есть ли встроенный способ остановить/прервать актера?

В Java у меня есть хобби с потоком, например:

Thread thread = new Thread() {

  @Override
  public void run() {
    //use this while loop, I can stop/ interrupt the thread when I want
    while (!isInterrupted()) {
      //...
    }
  }
};
thread.start();

а затем, когда я хочу остановить/прервать свой поток:

thread.interrupt();

Итак, мой вопрос: есть ли встроенный способ (поле/метод/функция...) в Scala, с помощью которого я могу остановить/прервать актера?

Это моя предыстория: я новичок в Scala, я действительно учусь программировать. И я нахожу свой лучший путь между актером и тредом. С моей точки зрения, мне нравится новый подход - актер.

P.S. Извините за мой английский...


person Community    schedule 14.11.2011    source источник
comment
Вы не должны делать блокировку в акторе, вы должны обрабатывать сообщения.   -  person Viktor Klang    schedule 14.11.2011


Ответы (2)


Как указано в другом ответе, модель актора специально разработана для ограничения всех взаимодействий с актером передачей и обработкой сообщений. Scala/Akka достигают этого, заставляя вас создавать Актера, вызывая метод actorOf. Поскольку у вас нет ссылки на базовый объект, вы не можете напрямую вызывать методы для него.

Итак, если вы хотите иметь Актера, которого можно прервать, просто обработайте какое-нибудь сообщение, которое делает это.

def receive = {
  case 'Interrupt => // handle interruption...
}

и в вашем клиентском коде

a ! 'Interrupt
person Connor Doyle    schedule 14.11.2011

Вы можете отправить Актеру PoisonPill, чтобы попросить его прекратить (см. http://akka.io/docs/akka/1.2/intro/getting-started-first-scala.html)

Обратите внимание, что это работает с akka Actors. Не знаю для scala актеров.

person David    schedule 14.11.2011