joc*_*ull 7 java multithreading sleep timer scheduled-tasks
我正在研究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);
Run Code Online (Sandbox Code Playgroud)
在正常操作中,这将以足够的准确度每隔3分钟发射一次(我不关心确切的秒或任何事情).这个问题是在计算机休眠几个小时左右之后,它似乎只是用积压的计时器请求BLAST系统.
它似乎在睡眠期间同时运行所有错过的计时器命中,试图弥补失去的时间.
有没有办法可以阻止这种情况?我尝试使用synchronized和其他一些线程技术,但这只能确保它们不会同时运行.他们仍然继续一个接一个地运行,直到积压通过.
感谢您的任何帮助,您可以提供!
你看过API了吗?它清楚地说明了以下内容:
在固定速率执行中,每次执行都是相对于初始执行的预定执行时间进行调度的.如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则会快速连续执行两次或更多次执行以"赶上".从长远来看,执行的频率将恰好是指定时间段的倒数(假设Object.wait(long)下的系统时钟是准确的).
这是您应该考虑使用ScheduledExecutorService的一个原因.此链接也可能有用.
| 归档时间: |
|
| 查看次数: |
8704 次 |
| 最近记录: |