2016-11-28 2 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에서의 null 오브젝트 에 방법 센드()를 호출 할 수 없습니다 (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 va : 48) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call (AbstractCallSite.java:113) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call (AbstractCallSite.java:125) at groovyx.gpars에서 groovyx.gpars.actor.AbstractLoopingActor $ 1.handleMessage (AbstractLoopingActor.java:70) 에서 groovyx.gpars.actor.DefaultActor.handleStart (DefaultActor.java:342) 에서 : Slave.act (11 ConsoleScript14) .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)) java.lang.Thread.run의 (Thread.java:745)

슬레이브를 만든 후에 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

관련 문제