1

我有一个演员,我想延迟执行一个动作,即像这样(伪代码):

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();
    }
    /*...*/
}

我仍然不确定这是否是正确的方法。

4

0 回答 0