在演员内部使用
Thread.sleep(5000);
是否正确?它真的能让演员睡 5 秒钟吗?有没有一种简单的替代方法可以让演员睡几秒钟?
Akka 不建议任何阻塞线程的东西。如果 Actor 配置了一个共享线程池(默认行为),那么使用 Thread.sleep 将从该池中保留一个线程,该线程可能正在为其他 Actor 工作。
如果一个人真的必须阻塞,那么一个演员可能被配置为有自己的线程。这可以通过配置一个自定义调度程序供演员使用来完成,完整的细节是here.
公认的阻塞替代方法是通过计时器安排对参与者的回调,例如在 5 秒后发送消息..
akkaSystem.scheduler.scheduleOnce(5 seconds, actor, "msgFoo")
Akka 调度程序记录在这里:http://doc.akka.io/docs/akka/2.3.6/scala/scheduler.html
我相信与这个主题相关的这些帖子有点旧,并且有些东西已经改变了。
以这个答案为出发点: “不要在 Actors 中使用 sleep()!那会导致线程被阻塞,导致您正试图避免的事情——耗尽资源。
相反,如果您只是处理消息而“什么都不做”,Actor 将不会用完任何调度资源,而只是堆上的另一个普通对象(占用一些内存但没有别的)。” 来自这篇文章:如何让演员入睡?
然后,这是一个示例,说明您可以采取哪些措施来获得与
Thread.sleep()
相同的行为
想要“睡觉”的演员内心
private void rescheduleActor() {
// schedule to wake up
logger.debug("rescheduleActor: Sleeping for 15 seconds");
getContext().getSystem().scheduler().scheduleOnce(
Duration.ofMillis(15000),
getSelf(),
new WakeUp(), getContext().getSystem().dispatcher(), null);
}
@Override
public void onReceiveOriginalCallerNotification(Object msg) {
if (msg instanceof WakeUp) {
logger.debug("rescheduleDistributionTrackEntry: Resuming process.");
methodToInvoke();
}
}