Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类星体中的施主计时器_Java_Actor_Quasar - Fatal编程技术网

Java 类星体中的施主计时器

Java 类星体中的施主计时器,java,actor,quasar,Java,Actor,Quasar,我有一个演员,我想延迟执行一个动作,即类似这样的动作(伪代码): 在处理另一条消息时,谨慎的做法是在另一个线程/串中等待,因此我为参与者添加了一个ScheduledThreadPool: ScheduledExecutorService executor = Executors.newScheduledThreadPool(0); void onReceive(message: Message){ if (message is DelayedAction){ execu

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

在处理另一条消息时,谨慎的做法是在另一个线程/串中等待,因此我为参与者添加了一个
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();
    }
    /*...*/
}
所以,等待是在executor线程池中执行的,然后将消息发送到actor.self以实际执行任务

但有时消息会丢失(只有增加池中的线程数才有帮助)。现在我不太确定我做的事情是否正确:可能quasar对ThreadPoolExecutor不合适,我应该使用其他方法来延迟操作执行

对于消息接收的延迟操作,正确的方法是什么

更新

我的另一个选择是使用无池光纤:

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();
    }
    /*...*/
}
void onReceive(消息:消息){
如果(消息为DelayedAction){
新纤维(){
@凌驾
受保护的V run()抛出SuspendExecution,InterruptedException{
睡眠(延迟);
sendMessageForAction();
}
}.start();
}
else if(消息为MessageForAction){
预成型体作用();
}
/*...*/
}
我仍然不确定这是不是正确的方式

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