Я работаю над 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
и некоторые другие методы потоков, но это только гарантирует, что они не все работают одновременно. Они по-прежнему работают один за другим, пока не будет выполнено отставание.
Спасибо за любую помощь, вы можете предоставить!