Java 在演员里面阻止一个阿克卡演员

Java 在演员里面阻止一个阿克卡演员,java,scala,akka,actor,Java,Scala,Akka,Actor,我有一个演员打算做一个长时间运行的工作,不会再收到任何消息: actor { def receieve => longRunningJob() } 我如何调试杀死这个演员的过程 我遵循了说明“在参与者中,可以通过使用上下文引用停止子参与者”的文档: 我也试着给孩子发送一个杀死消息,一个停止消息,一个毒药丸消息,但是在长时间运行的过程中没有任何东西阻止它。 不是停止演员失败,就像演员从来没有机会去处理与阻止它有关的信息。参与者在设计上是单线程的,并且应该构造为

我有一个演员打算做一个长时间运行的工作,不会再收到任何消息:

    actor {
       def receieve => longRunningJob()
    }
我如何调试杀死这个演员的过程

我遵循了说明“在参与者中,可以通过使用上下文引用停止子参与者”的文档:


<>我也试着给孩子发送一个杀死消息,一个停止消息,一个毒药丸消息,但是在长时间运行的过程中没有任何东西阻止它。

不是停止演员失败,就像演员从来没有机会去处理与阻止它有关的信息。参与者在设计上是单线程的,并且应该构造为在消息循环中尽可能少地执行阻塞

在本例中,您真正要问的是“如何中断线程”,因为
longRunningJob
似乎是一个单线程、阻塞、时间密集型任务,答案是,确实没有好方法


进入“处理长时间运行的作业”状态的参与者应在不阻塞消息循环本身的情况下执行此操作,方法是使作业本身异步(如果参与者停止,则使其处于孤立状态并运行),或者作业本身由许多小步骤组成,每一个步骤都会触发下一个步骤,并向其自身返回一条消息,因此,a)您可以接收其他消息,b)有机会中途中断作业

那么您想停止
longRunningJob()
?或者你想让代码> LoRununJOB()/<代码>完成,然后杀死LunGrunnJube()不应该完成。你应该问的问题应该是如何在执行过程中停止一个函数。该函数没有被
毒药等杀死的原因是,演员在完成他正在做的事情之前甚至看不到这些消息。对,我知道消息将按顺序处理,但我认为context.stop(childActor)的功能不同。引用:在
stop
的行为中,“参与者将继续处理其当前消息(如果有),但不会处理其他消息。”
    context.stop(childActor)