Как я могу выполнить задачу через равные промежутки времени, но таким образом, чтобы шаг не мог начаться, пока не завершится последний - PullRequest
1 голос
/ 23 марта 2019

У меня есть агент-ориентированная модель, которую мне нужно обновлять каждые 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);
}

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Вы также можете оценить Akka Scheduler .Это гарантирует, что не будет перекрытия выполнений выполняемого объекта.Вот фрагмент из их документации:

Если выполнение исполняемого файла занимает больше интервала, последующее выполнение начнется сразу после завершения предыдущего (не будет перекрытия выполнений выполняемого объекта).).В таких случаях фактический интервал выполнения будет отличаться от пройденного интервала.

0 голосов
/ 23 марта 2019

Взгляните на ScheduledExecutorService#scheduleAtFixedRate(). Он будет выполнять вашу задачу либо каждые t миллисекунды, либо сразу после последнего выполнения, если это заняло больше времени, чем t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...