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