如何通过GPars中的主演员终止所有奴隶演员?

时间:2016-11-28 22:09:53

标签: java multithreading groovy 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线程Actor Thread 2中发生异常   java.lang.NullPointerException:无法在null对象上调用方法send()       at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)       在org.codehaus.groovy.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)       at groovyx.gpars.actor.DefaultActor.handleStart(DefaultActor.java:342)       at groovyx.gpars.actor.AbstractLoopingActor $ 1.handleMessage(AbstractLoopingActor.java:70)       at groovyx.gpars.util.AsyncMessagingCore.run(AsyncMessagingCore.java:132)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)       在java.lang.Thread.run(Thread.java:745)

在我创建奴隶之后看起来我无法设置sl.master。

有解决方法吗?

非常感谢任何帮助 提前谢谢!

1 个答案:

答案 0 :(得分:1)

首先应设置actor,然后启动它们: def sl = new Slave() def ma = new Master(slaves: [sl]) sl.master = ma sl.start() ma.start()

但是,你的奴隶演员在主人甚至试图杀死他们之前就用完了他们的act()方法,所以实际上不需要杀死奴隶。

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