2016-11-28 17 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 

此代碼不能編譯。
錯誤消息:

例外發生在演員線程演員線程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。

是否有解決方法?

任何幫助,非常感謝。
預先感謝您!

回答

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

相關問題