我有一个演员,我想延迟执行一个动作,即像这样(伪代码):
void onReceive(message: Message){
if (message is DelayedAction){
sleep(100);
preformSomeAction();
}
/*...*/
}
在处理另一条消息时在另一个线程/链中等待是谨慎的,所以我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,我应该使用其他方法来延迟操作执行?
什么是延迟消息接收操作的正确方法?
更新:
我的另一种选择是使用没有池的光纤:
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();
}
/*...*/
}
我仍然不确定这是否是正确的方法。