java - 如何定期执行任务,但在某种程度上,直到最后一个步骤完成后才能开始步骤

标签 java concurrency

我有一个基于代理的模型,需要每 t 毫秒更新一次。在每个更新步骤中,所有代理对象都需要得到通知并执行一些代码。我希望每一步都持续 t 或直到最后一步完成,无论哪个时间更长。

我该怎么做?我正在尝试使用 Timer.schedule,但它似乎没有等待,因为我收到了 ConcurrentModificationException。

public void startClock(long delay) {

    Timer timer = new Timer("clock", true);
    TimerTask clockTask = new TimerTask() {

        @Override
        public void run() {
            World.INSTANCE.update(); //this updates all agents
            step++;
            for (Timed task : listeners) {
                task.run();
            }
        }
    };
    timer.schedule(clockTask, delay, interval); //miliseconds
}

public void startClock() {
    startClock(interval);
}

最佳答案

看看ScheduledExecutorService#scheduleAtFixedRate() 。它将每隔 t 毫秒执行您的任务,或者如果花费的时间超过 t,则在上次执行后立即执行您的任务。

关于java - 如何定期执行任务,但在某种程度上,直到最后一个步骤完成后才能开始步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55310126/

相关文章:

java - 如何枚举 JDK 的所有 MBean?

java - java集合流上的map和filter之间的区别

c# - 如何保证同一时间只有一个用户可以执行一段代码

haskell - 找出多个互斥的、可能不终止的 Bool 中的哪一个是 True

python - "Pythonic"多线程(并发)语言

java - 如何测试java应用程序的性能瓶颈?

java - GWT 持久 URL

Python urllib2.urlopen() 很慢,需要一个更好的方法来读取多个 url

java - if 条件在 selenium webdriver 中出现错误

c++ - 为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?