Таймер Java и scheduleAtFixedRate + приостановка системы - PullRequest
7 голосов
/ 06 апреля 2011

Я работаю над Java-программой и использую Timer объекты для запуска задач каждые несколько минут или часов. Это нормально работает в обычных операциях, но у меня проблема с «спящим режимом» на Mac (возможно, на других ОС, но я еще не пробовал).

Рассмотрим этот пример кода:

//Setup the timer to fire the ping worker (every 3 minutes)
_PingTimer.scheduleAtFixedRate(new TimerTask(){
        public void run(){
            Program.PingThread = new PingWorker(Settings.Username, Settings.UserHash, true, true);
            Program.PingThread.CheckOpenPort = true;
            Program.SwingExecutor.execute(Program.PingThread);
        }
    }, 0, 180000);

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

Кажется, что он запускает все пропущенные таймеры одновременно во время сна, пытаясь наверстать упущенное.

Есть ли способ, которым я могу предотвратить это? Я попытался использовать synchronized и некоторые другие методы потоков, но это только гарантирует, что они не все работают одновременно. Они по-прежнему работают один за другим, пока не будет выполнено отставание.

Спасибо за любую помощь, вы можете предоставить!

Ответы [ 2 ]

5 голосов
/ 06 апреля 2011

Вы смотрели на API ?В нем четко указано следующее:

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

Это одна из причин, по которой вам следуетрассмотрите возможность использования ScheduledExecutorService .Эта ссылка также может оказаться полезной.

2 голосов
/ 06 апреля 2011

Используйте schedule вместо scheduleAtFixedRate.

...