2016-11-28 2 views
0

Я бы хотел, чтобы мой мастер-актер прекратил действие всех рабов, как только первый закончит свою работу.
Однако я понятия не имею, как я могу отправить трансляцию от своего хозяина ко всем рабам. Есть ли функция или шаблон программирования для этого?Как прекратить действие всех подчиненных актеров через главного актера в 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 после создания раба.

Есть ли обходной путь для этого?

Любая помощь очень ценится.
Спасибо заранее!

ответ

1

Вы должны сначала настроить актеры, а затем запустить их: def sl = new Slave() def ma = new Master(slaves: [sl]) sl.master = ma sl.start() ma.start()

Однако ваши актеры Подчиненные закончить сами, запустив из своего акта() метод, прежде чем хозяин даже не пытается убить их, так что нет убийства на самом деле нужны рабы.

GPars предлагает прекратить() метод на актеров, чтобы убить их изящно, так что вы могли бы рассмотреть вопрос об изменении вашего метод: void killTheSlaves() { for (i in 0..slaves.size()-1){ slaves[i].terminate() } }

+0

Черт! Теперь, когда вы это указали, это абсолютно очевидно. Большое спасибо! Мой оригинальный код немного больше, чем просто печать, поэтому я надеюсь, что, по крайней мере, не все подчиненные заканчиваются самостоятельно, прежде чем мастер их завершает. Для отправки здесь я немного сократил код. – hsvar

Смежные вопросы