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