Я бы хотел, чтобы мой мастер-актер прекратил действие всех рабов, как только первый закончит свою работу.
Однако я понятия не имею, как я могу отправить трансляцию от своего хозяина ко всем рабам. Есть ли функция или шаблон программирования для этого?Как прекратить действие всех подчиненных актеров через главного актера в GPars?
Еще один способ решить эту проблему - предоставить мастеру список всех подчиненных устройств и пропустить их, отправив каждое сообщение для завершения, однако ведомым устройствам также нужен мастер как атрибут, и я думаю, что это проблема :
import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor
class Slave extends DefaultActor {
Actor master
int t
void act() {
t = new Random().nextInt(1337)
println "It's me, $t"
master.send 0
}
}
class Master extends DefaultActor {
List slaves
void afterStart() {
println "Master initialized!"
}
void killTheSlaves() {
for (i in 0..slaves.size()-1){
slaves[i].send -1
}
}
void act() {
react { int num ->
if (num == 0)
killTheSlaves()
}
}
}
def sl = new Slave().start()
def ma = new Master(slaves: [sl]).start()
sl.master = ma
Этот код не компилируется. сообщение
Ошибка:
Исключение в Actor нити Актер Тема 2 java.lang.NullPointerException: Невозможно вызвать метод отправки() на нулевой объект в org.codehaus.groovy.runtime.NullObject.invokeMethod (NullObject.java:91) at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call (PogoMetaClassSite.java:48) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall (CallSiteArray.java:48)) at org.codehaus.groovy.runtime.callsite.NullCallSite.call (NullCallSite.java:35) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall (CallSiteArray.ja va: 48) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call (AbstractCallSite.java:113) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call (AbstractCallSite.java:125) at Slave.act (ConsoleScript14: 11) at groovyx.gpars.actor.DefaultActor.handleStart (DefaultActor.java:342) at groovyx.gpars.actor.AbstractLoopingActor $ 1.handleMessage (AbstractLoopingActor.java:70) у groovyx.gpars .util.AsyncMessagingCore.run (AsyncMessagingCore.java:132) на java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) на java.lang.Thread.run (Thread.java:745)
Похоже, я не могу установить sl.master после создания раба.
Есть ли обходной путь для этого?
Любая помощь очень ценится.
Спасибо заранее!
Черт! Теперь, когда вы это указали, это абсолютно очевидно. Большое спасибо! Мой оригинальный код немного больше, чем просто печать, поэтому я надеюсь, что, по крайней мере, не все подчиненные заканчиваются самостоятельно, прежде чем мастер их завершает. Для отправки здесь я немного сократил код. – hsvar