我想讓我的主演演員在第一個演員完成作品後儘快終止所有奴隸演員。
但是,我不知道如何從主人發送廣播給所有的奴隸。有沒有一個函數或編程模式呢?如何通過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
此代碼不能編譯。
錯誤消息:
例外發生在演員線程演員線程2 顯示java.lang.NullPointerException:在org.codehaus.groovy.runtime.NullObject.invokeMethod不能調用空對象 上send()方法(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 (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) at groovyx.gpars .util.AsyncMessagingCore.run(AsyncMessagingCore.java:132) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617 ) at java.lang.Thread.run(Thread.java:745)
看起來我在創建slave之後無法設置sl.master。
是否有解決方法?
任何幫助,非常感謝。
預先感謝您!
該死!現在你指出了,這是顯而易見的。非常感謝你!我原來的代碼不僅僅是打印,所以我希望至少不是所有的奴隸在主人終止之前自己完成。對於張貼在這裏,我略微刪減了一些代碼。 – hsvar