Выполнение задачи в каждый x раз

Я пытаюсь выполнить задачу каждое 5-минутное. Потребность задачи начаться с: xx:00, xx:05, xx:10, xx:15 и так далее поэтому, если время - xx:37 задача, начнется в xx:40.

Я используюсь следующий код, чтобы сделать это:

    Date d1 = new Date();
    d1.setMinutes(d1.getMinutes() + 5 - d1.getMinutes()%5);
    d1.setSeconds(0);
    this.timer.schedule(new Send(), d1, TEN_MINUTES/2);

Пошлите похож на это:

class Send extends TimerTask
{
    public void run()
    {
        if(SomeCondition)
                    {
                            Timestamp ts1 = new Timestamp(new java.util.Date().getTime());
                            SendToDB(ts1);
                    }
    }
}

Таким образом, результат должен быть отчетами это, если бы вы % минуты результат были бы 0. Но время отчетов, которое я имею:

*5:35:00 *7:44:40 *7:54:40 *9:05:31 *9:50:00

Поскольку вы видите, что первая задача начинается отлично, но тогда что-то пошло не так, как надо.

Мое предположение - то, что задача calculateds 5-минутный скачок после предыдущей задачи закончена так эффекты времени выполнения задачи, но это - просто предположение.

0
nl ja de
"если бы вы % минуты, которыми результат был бы 0" это, не правы.
добавлено автор Subhrajyoti Majumder, источник
Если вы хотите бежать в определенные минуты каждого часа, необходимо смотреть на Кварцевый Планировщик кварц-scheduler.org
добавлено автор Mark, источник

3 ответы

Время, которое задача занимает, чтобы выполнить, задержит график. От the docs for schedule:

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

Вы будете более обеспеченным использованием scheduleAtFixedRate.

Альтернативно, вы могли бы попытаться использовать простое Нить с петлей, чтобы неоднократно выполнить задачу. Последний шаг в петле может быть должен спать необходимое время, пока вы не хотите начать задачу снова. Предполагая, что никакое повторение петли не занимает пять минут, это устранит совокупные задержки.

public void run() {
    long start = System.currentTimeMillis();
    while (shouldRun()) {
        doTask();
        long next = start + FIVE_MINUTES;
        try {
            Thread.sleep(next - System.currentTimeMillis());
            start = next;
        } catch (InterruptedException e) {
            . . .
        }
    }
}

Это начнет каждое повторение в следующем пятиминутном интервале и не накопит задержки из-за времени выполнения doTask() или любые системные задержки. Я не посмотрел на источники, но я подозреваю, что это близко к тому, что находится в Timer.scheduleAtFixedRate .

2
добавлено
Крошечный вопрос, нить будет спать после того, как он выполнит задачу поэтому, если я начинаю в xx:00, и задача занимает 1 минуту, и он спит в течение 5 минут, следующая задача будет произведена в xx:06
добавлено автор Imri Persiado, источник
@ImriPersiado - Посмотрите тщательно на то, как период сна вычисляется. Если задача займет одну минуту, повторение петли будет тогда спать в течение четырех минут, не пять.
добавлено автор Ted Hopp, источник

Почему вы не используете a Планировщик задач или просто сон командует в петле, которая позволяет сну нити в течение 5 минут затем продолжиться.

An alternative would be to use a Timer class

1
добавлено

Я, вероятно, использовал бы ScheduleExecutorService.scheduleAtFixedRate который является более современным подходом, чем использование Таймер и допускал бы наличие многократных рабочих потоков в случае, если есть много намечаемых задач.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async