在类星体的演员的计时器

时间:2017-09-19 12:28:41

标签: java actor quasar

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

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

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

0 个答案:

没有答案