我正在开发的游戏中遇到以下情况:
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 - 有更好的方法吗?也许将移动
存储在某个队列上?
谢谢!
最佳答案
Timer
和ScheduledExecutorService
都可以按固定速率或在执行之间固定延迟执行任务。这意味着,具有固定速率的计划任务将补偿执行的运行时间(包括阻塞时间)。具有固定延迟的计划任务则不会。有关详细信息,请参阅以下方法的文档:- 总有更好的方法。不过,解决方案看起来不错。只要它对你有用,就坚持下去。
关于java - 将周期性任务与另一个线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18515729/