ScheduledExecutorService

ScheduledExecutorService

我正在工作的游戏中出现以下情况:

class GameLogic implements Runnable
{
    State state;

    private State changeState()
    {
        //state changes here (note the `private`)
    }

    // this ticks at each 0.5 seconds
    public void run()
    {
      //code that changes state
      changeState();
    }

    // this will be called by a external Thread at any moment
    public void update(Move move)
    {
       //code that changes state
       applyMove(move);
    }

    private void applyMove(Move move)
    {
         //state changes here
         //state = ... doesn't matter
    }

}


上面的run方法计划使用Timer或ScheduledExecutorService每0.5秒执行一次。

问题是update方法,该方法随时会被另一个线程调用。所以我问:

1-如果使用synchronized保护state字段会怎样?计时器会等待吗?如何补偿“等待期”?

2-有更好的方法吗?也许将moves存储在某个队列中?

谢谢!

最佳答案

TimerScheduledExecutorService都可以以固定的速率执行任务,或者在执行之间具有固定的延迟。这意味着,具有固定速率的计划任务将补偿执行的运行时间(包括阻塞时间)。具有固定延迟的计划任务不会。有关更多信息,请参见以下方法的文档:

固定汇率:Timer.scheduleAtFixedRateScheduledExecutorService.scheduleAtFixedRate
固定延迟:Timer.scheduleScheduledExecutorService.scheduleWithFixedDelay

总有更好的方法。但是,该解决方案看起来不错。只要它对您有用,那就继续吧。

07-24 09:49
查看更多