Java 将定期任务与另一个线程同步

Java 将定期任务与另一个线程同步,java,multithreading,concurrency,Java,Multithreading,Concurrency,在我工作的游戏中,我有以下情况: 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 tha

在我工作的游戏中,我有以下情况:

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方法计划使用计时器或ScheduledExecutorService每0.5秒执行一次

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

1-如果使用
synchronized
来保护
状态
字段,会发生什么情况?计时器会等吗?它将如何补偿“等待期”

2-有更好的方法吗?也许在某个队列上存储
移动

谢谢

  • Timer
    ScheduledExecutorService
    都可以以固定的速率或在执行之间有固定的延迟来执行任务。这意味着,具有固定速率的计划任务将补偿执行的运行时间(包括阻塞时间)。具有固定延迟的计划任务将不可用。有关更多信息,请参阅以下方法的文档:
    • 固定利率:及
    • 固定延误:及
  • 总有更好的办法。然而,解决方案看起来不错。只要它对你有用,就跟着它走

  • 处理此问题的另一种方法是将来自更新线程的更新转到或类似的位置。这样,在调整状态的每次迭代中,您都可以从队列中获取所有更新,并将它们应用到同一线程中

    使用这种方法,更新线程和游戏循环线程之间永远不会有任何冲突

    就我个人而言,我会使用一个while循环,它利用一些调节机制,而不是安排任何事情。您可以使用,以便使用时间增量应用更新。这将确保逻辑的执行不受机器性能的限制


    关于这个话题有一篇精彩的文章。

    谢谢!实际上,我的问题有点复杂,但我把问题尽量简化了。我会运行一些测试,然后回来进行编辑,如果必要的话。是的,我也考虑过这样做,现在我必须决定走哪条路。