我想让我的主演员在第一个演员完成工作后立即终止所有奴隶演员。
但是,我不知道如何从我的主人向所有奴隶发送广播。有这方面的功能或编程模式吗?
解决这个问题的另一种方法是给主节点一个所有从节点的列表并循环遍历它们,向每个节点发送一条消息以终止,但是从节点也需要主节点作为属性,我认为这是一个问题:
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 线程 Actor 线程 2 java.lang.NullPointerException 发生异常:无法在 org.codehaus.groovy 的 org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91) 的空对象上调用方法 send() .runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.NullCallSite.call (NullCallSite.java:35) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 在org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 在 Slave.act(ConsoleScript14:11) 在 groovyx.gpars.actor.DefaultActor。handleStart(DefaultActor.java:342) 在 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)爪哇:745)爪哇:745)
看起来我创建奴隶后无法设置 sl.master 。
有解决方法吗?
任何帮助是极大的赞赏。
先感谢您!