1

我想创建一个持续执行任务的 Actor,然后它可以通过外部调用停止来停止,但被完全阻塞了。

演员应该看起来如下

myActor = actor {
        loop {
            react { message ->
                if(message instanceof String && "stop".equals(message))
                {
                    stop()
                } 
            }
        }

        while(true)
        {
                // do some work
        }
    }

创建完成后,可以通过我的测试文件@BeforeMethod 启动actor:

myActor.start()

它的句柄可以由主线程保留,并通过我的测试文件中的以下命令停止,@AfterMethod:

myActor.send "stop"

但是,我无法使用上述方法。首先,我发现我不需要“myActor.start()”,在@BeforeMethod之后,它只是自动运行;

其次,虽然我尝试在我的测试文件的@AfterMethod 中调用“myActor.send”“停止”,但看起来 myActor 的循环{}从未被访问过,并且一直在使用 while{}。

我也尝试将 loop{} 放入 while{},但它仍然无法正常工作,并且 loop{} 仍然没有被调用

我错过了什么吗?

谢谢!

4

1 回答 1

0

此代码段应向您展示如何构建代码:

def myActor = Actors.actor {
    loop {
        react { message ->
            if(message instanceof String && "stop".equals(message))
            {
                stop()
            }
        }
    }
}

myActor.metaClass.afterStop = {
    while(true)
    {
        // do some work
        println "After finished"
        return
    }
}

myActor.send "stop"

sleep 5000

几点注意事项:

  1. 将 while after loop() 放在同一个主体中确实具有控制流在循环开始之前到达 while 循环的效果。
  2. 您可能会考虑直接在 actor 上调用 stop(),而不是发送人为的“停止”消息。afterStop 处理程序仍将被调用。
  3. 通过 actor() 工厂方法启动的 Actor 会自动启动。
于 2014-07-30T06:29:47.993 回答