我正在工作的游戏中出现以下情况:
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
存储在某个队列中?谢谢!
最佳答案
Timer
和ScheduledExecutorService
都可以以固定的速率执行任务,或者在执行之间具有固定的延迟。这意味着,具有固定速率的计划任务将补偿执行的运行时间(包括阻塞时间)。具有固定延迟的计划任务不会。有关更多信息,请参见以下方法的文档:
固定汇率:Timer.scheduleAtFixedRate和ScheduledExecutorService.scheduleAtFixedRate
固定延迟:Timer.schedule和ScheduledExecutorService.scheduleWithFixedDelay
总有更好的方法。但是,该解决方案看起来不错。只要它对您有用,那就继续吧。