我有一个演员,我想用延迟执行一个动作,就像这样(伪代码):
void onReceive(message: Message){
if (message is DelayedAction){
sleep(100);
preformSomeAction();
}
/*...*/
}
在处理其他消息时等待另一个线程/链是谨慎的,所以我为一个actor添加了ScheduledThreadPool
:
ScheduledExecutorService executor = Executors.newScheduledThreadPool(0);
void onReceive(message: Message){
if (message is DelayedAction){
executor.schedule(sendMessageForAction, delay, TimeUnit.MILLISECONDS);
}
else if (message is MessageForAction){
preformSomeAction();
}
/*...*/
}
因此,在执行程序线程池中执行等待,然后将一条消息发送给actor.self以实际执行任务。
但有时消息会丢失(只有增加池中的线程数才有帮助)。现在我不太确定我做的是正确的事情:使用threadPoolExecutors可能是quasar不行,我应该使用其他方法来延迟动作执行吗?
对邮件接收采取延迟行动的正确方法是什么?
更新:
对我来说另一个选择是使用不带池的纤维:
void onReceive(message: Message){
if (message is DelayedAction){
new Fiber<V>() {
@Override
protected V run() throws SuspendExecution, InterruptedException {
Strand.sleep(delay);
sendMessageForAction();
}
}.start();
}
else if (message is MessageForAction){
preformSomeAction();
}
/*...*/
}
我仍然不确定这是否是正确的方法。