我正在开发一个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”和其他线程技术,但这只能确保它们不会同时运行。它们仍然会一个接一个地运行,直到处理完积压任务为止。
感谢您提供的任何帮助!