Java Timer и scheduleAtFixedRate + System Suspend

Я работаю над программой 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 один за другим, пока не будет пройдено отставание.

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

7
задан jocull 6 April 2011 в 14:46
поделиться