Первая ошибка в том, что вы написали result == true
. Это должно быть изменено на result = true
Вы должны удалить значение true
из условия while. Это не имеет никакого влияния.
В объекте BowTest
вы должны добавить после инструкции g.bow(a)
Thread.sleep(1000)
, чтобы дать актерам достаточно времени для ответа на сообщения.
Таким образом, ваш код должен работать. Но все же у него есть тупик. Если вы измените g.bow(a)
на a.bow(g)
, выполнение будет остановлено. Это вызвано блоком receive
. Каждый актер ожидает сообщения Bowed, но он не может ответить на сообщение BowBack.
Когда вы отвечаете на сообщение, вы должны использовать блок receive
, только если вы уверены, что субъект получит указанные сообщения. Но обычно это не очень хорошая практика в проектировании актеров. Они не должны блокировать. Основная цель актера - максимально быстро ответить на сообщение. Если вам нужно выполнить большую задачу, вы должны использовать futures
, но в этом случае это не требуется.
Решение будет заключаться в том, чтобы сохранить людей, которые склонены в списке. Когда актер должен поклониться человеку, он добавляет его в список. Когда актер поклоняется человеку, который находится в списке, он удаляет этого человека из списка.
while (true) {
react {
case Bow(p) =>
println(this.name + " is bowing to " + p.name)
addPersonToBowList(p)
p ! BowBack(this)
case Bowed(other) if isPersonInBowList(other) =>
println(" ... " + this.name + " has bowed to " + other.name)
removePersonFromBowList(other)
case BowBack(p) =>
println(this.name + " is bowing back to " + p.name)
p ! Bowed(this)
case "EXIT" => exit()
case x => println(x)
}
}