0

我想让我的主演员在第一个演员完成工作后立即终止所有奴隶演员。
但是,我不知道如何从我的主人向所有奴隶发送广播。有这方面的功能或编程模式吗?

解决这个问题的另一种方法是给主节点一个所有从节点的列表并循环遍历它们,向每个节点发送一条消息以终止,但是从节点也需要主节点作为属性,我认为这是一个问题:

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 。

有解决方法吗?

任何帮助是极大的赞赏。
先感谢您!

4

1 回答 1

1

您应该首先设置演员,然后启动他们: def sl = new Slave() def ma = new Master(slaves: [sl]) sl.master = ma sl.start() ma.start()

但是,您的 Slave actor 在 master 甚至试图杀死它们之前通过用完他们的 act() 方法自行完成,因此实际上不需要杀死 slave。

GPars 为 actor 提供了一个 terminate() 方法来优雅地杀死它们,因此您可以考虑将您的方法更改为: void killTheSlaves() { for (i in 0..slaves.size()-1){ slaves[i].terminate() } }

于 2016-11-29T14:39:45.137 回答