java - 将周期性任务与另一个线程同步

标签 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 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 方法计划使用 TimerScheduledExecutorService 每 0.5 秒执行一次。

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

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

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

谢谢!

最佳答案

  1. TimerScheduledExecutorService 都可以按固定速率或在执行之间固定延迟执行任务。这意味着,具有固定速率的计划任务将补偿执行的运行时间(包括阻塞时间)。具有固定延迟的计划任务则不会。有关详细信息,请参阅以下方法的文档:
  2. 总有更好的方法。不过,解决方案看起来不错。只要它对你有用,就坚持下去。

关于java - 将周期性任务与另一个线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18515729/

相关文章:

ios - 在后台检测可达性

c# - 奥尔良无国籍 worker

c# - 同时运行两个winform窗口

java - 在Spark-cluster上。是否有一个参数控制spark作业的最短运行时间

java - Android Studio 不允许我设置 TextView

java - 使用java在cmd中执行多个命令

c# - 为什么C#中线程数大于1

java - 如何在ReentrantLock锁定的临界区中等待指定时间?

java - 匿名线程类无法访问非静态实例变量

公共(public)类 MyApplication extends Application 引起的 java.lang.NullPointerException