1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем MuffinColor, 29 июл 2019.

Метки:
  1. Автор темы
    MuffinColor

    MuffinColor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    MuffinColor
    Здравствуйте, мне нужно запускать таск именно тогда, когда наступает новый час. То есть, таск запустится в 12:00 следующий в 13:00. Но это не должно работать как сон для таска. Я смогу например запустить сервер в 13:30, но таск все равно сработает в 14:00, НЕ в 14:30. Заранее спасибо.
     
  2. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Есть несколько вариантов. Для начала запуск таска имеет 2 параметра: период и смещение до первого запуска. Ещё можно запускать периодичностью в минуту. Или ещё много вариантво.
     
  3. Автор темы
    MuffinColor

    MuffinColor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    MuffinColor
    Не знаю, верно ли мое решение, но таск запускаю каждые 10 минут, чтобы проверить наступление нового часа. В таске есть условие, что если текущие минуты равны 0, то наступил новый час и выдается награда.
     
  4. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Запуск сервера произошёл в 1322, не удастся ваш кейс.
     
  5. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Таски выполняются в тиках. Т.е. если сервер будет лагать, выполнение может задержаться на несколько секунд, а то и минут, а значит проверка на 0 минут может не сработать.
     
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
            for(;;) {
                if(LocalTime.now().getMinute()==0&&LocalTime.now().getSecond()==0) {
                    //TODO
                }
                Thread.sleep(1000);
            }
     
  7. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Thread.sleep(1000); может спать дольше 1 секунды, как весёлый результат, можно получить, что в какой-то час не сработает событие. А ещё на какой-нибудь windows может сработать дважды в час, когда Thread.sleep(1000); окажется меньше 1 секунды.
     
  8. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Там не на столько серьезная погрешность для повтора 0 секунд 2 раза, а уж пропуска и подавно.
    Даже спецом провел тест. За пару часов итерацйий ни одного повтора и пропуска.
    На твоем нелюбимом windows кстати.
    Если что, от параноиков можно воткнуть булев на проверку повторение.
     
    Последнее редактирование: 29 июл 2019
  9. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Кто сказал нелюбимом? Я хорошо знаю как работает windows, у одной из jvm sleep завязан в винде на getTickCount, который у меня срабатывал дважды в секунду или раз в 2-3 секунды без прослойки jvm. Опять же вопрос в стечении обстоятельств. Windows, как и *nix'ы не являются RTOS'ами, что значит, что кол****ия вверх и вниз могут быть. Далее, никто не гарантирует исполнения потока тут же, как кончится sleep, т.е. управление потоку может быть передано и через минуту, если так решит машина.
    Жёсткие условия проверок для динамически изменяемых данных не рекомендуются. В твоём варианте я бы как минимум сравнивал время с предыдущим запуском, а не с абстрактным нулём.
     
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну короче - выбрасывайте.
     
  11. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Так и знал, что кто то отыщет эту либу :D
     
  13. Автор темы
    MuffinColor

    MuffinColor Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    MuffinColor
    Благодарю. Тема закрыта.
     
  14. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Ну, типа камон, есть же готовые решения, в том числе и в jdk без доп либ, только в этом случае надо немного посчитать время.
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Дык и я о чем? Целую либу с парсером cron строки для одной задачи.
     

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