Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Запуск таска относительно реального времени

Метки:
Теги Теги
java task таск

MuffinColor

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
MuffinColor
Здравствуйте, мне нужно запускать таск именно тогда, когда наступает новый час. То есть, таск запустится в 12:00 следующий в 13:00. Но это не должно работать как сон для таска. Я смогу например запустить сервер в 13:30, но таск все равно сработает в 14:00, НЕ в 14:30. Заранее спасибо.
 
Есть несколько вариантов. Для начала запуск таска имеет 2 параметра: период и смещение до первого запуска. Ещё можно запускать периодичностью в минуту. Или ещё много вариантво.
 
Есть несколько вариантов. Для начала запуск таска имеет 2 параметра: период и смещение до первого запуска. Ещё можно запускать периодичностью в минуту. Или ещё много вариантво.
Не знаю, верно ли мое решение, но таск запускаю каждые 10 минут, чтобы проверить наступление нового часа. В таске есть условие, что если текущие минуты равны 0, то наступил новый час и выдается награда.
 
Не знаю, верно ли мое решение, но таск запускаю каждые 10 минут, чтобы проверить наступление нового часа. В таске есть условие, что если текущие минуты равны 0, то наступил новый час и выдается награда.
Запуск сервера произошёл в 1322, не удастся ваш кейс.
 
Не знаю, верно ли мое решение, но таск запускаю каждые 10 минут, чтобы проверить наступление нового часа. В таске есть условие, что если текущие минуты равны 0, то наступил новый час и выдается награда.
Таски выполняются в тиках. Т.е. если сервер будет лагать, выполнение может задержаться на несколько секунд, а то и минут, а значит проверка на 0 минут может не сработать.
 
Код:
        for(;;) {
            if(LocalTime.now().getMinute()==0&&LocalTime.now().getSecond()==0) {
                //TODO
            }
            Thread.sleep(1000);
        }
Thread.sleep(1000); может спать дольше 1 секунды, как весёлый результат, можно получить, что в какой-то час не сработает событие. А ещё на какой-нибудь windows может сработать дважды в час, когда Thread.sleep(1000); окажется меньше 1 секунды.
 
Thread.sleep(1000); может спать дольше 1 секунды, как весёлый результат, можно получить, что в какой-то час не сработает событие. А ещё на какой-нибудь windows может сработать дважды в час, когда Thread.sleep(1000); окажется меньше 1 секунды.
Там не на столько серьезная погрешность для повтора 0 секунд 2 раза, а уж пропуска и подавно.
Даже спецом провел тест. За пару часов итерацйий ни одного повтора и пропуска.
На твоем нелюбимом windows кстати.
Если что, от параноиков можно воткнуть булев на проверку повторение.
 
Последнее редактирование:
Там не на столько серьезная погрешность для повтора 0 секунд 2 раза, а уж пропуска и подавно.
Даже спецом провел тест. За пару часов итерацйий ни одного повтора и пропуска.
На твоем нелюбимом windows кстати.
Кто сказал нелюбимом? Я хорошо знаю как работает windows, у одной из jvm sleep завязан в винде на getTickCount, который у меня срабатывал дважды в секунду или раз в 2-3 секунды без прослойки jvm. Опять же вопрос в стечении обстоятельств. Windows, как и *nix'ы не являются RTOS'ами, что значит, что кол****ия вверх и вниз могут быть. Далее, никто не гарантирует исполнения потока тут же, как кончится sleep, т.е. управление потоку может быть передано и через минуту, если так решит машина.
Жёсткие условия проверок для динамически изменяемых данных не рекомендуются. В твоём варианте я бы как минимум сравнивал время с предыдущим запуском, а не с абстрактным нулём.
 
Так и знал, что кто то отыщет эту либу :D
Кто сказал нелюбимом?
Индус ответил на stackoverflow, ещё вопрос по такой же теме. Поиск занял 3 минуты.
Благодарю. Тема закрыта.
 
Ну, типа камон, есть же готовые решения, в том числе и в jdk без доп либ, только в этом случае надо немного посчитать время.
Дык и я о чем? Целую либу с парсером cron строки для одной задачи.
 

Поделиться этой страницей

Назад
Верх