我有一个代码
for (int i = 0; i < 10000 i++) {
//call every 1000ms
Thread.sleep(1000);
doLongTimeOperation();
}
长时间操作
void doLongTimeOperation(){
//Long time op
Thread.sleep(randomInt);
}
我需要在每个固定的时间段(1000)调用此方法。 IE,如果方法在500ms内执行,则下一次调用应该在500ms(500 + 500 = 1000)之后。如果方法在2000ms内执行,则下一次调用应在0ms之后。怎么实现呢?感谢
答案 0 :(得分:1)
最佳选项是ScheduledExecutorService.scheduleWithFixedDelay方法。
scheduleWithFixedDelay(Runnable命令,long initialDelay,long delay,TimeUnit unit):
"Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next."
有关详细信息,请查看以下链接:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleWithFixedDelay(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)
没有计算任何事情的紧张:)。注意它与scheduleAtFixedRate方法不同。希望它有所帮助。
答案 1 :(得分:1)
我相信你真正想要的是以固定费率安排。
创建并执行首先启用的定期操作 在给定的初始延迟之后,以及随后的给定时期; 那是执行将在initialDelay之后开始 initialDelay + period,然后是initialDelay + 2 * period,依此类推。
答案 2 :(得分:-1)
您问题的简单答案是衡量使用System.currentTimeMillis()测量差异之前和之后花费的时间。从你想要的等待时间中减去这个差异。
long start = System.сurrentTimeMillis();
// do stuff
long duration = System.сurrentTimeMillis()-start;
Thread.sleep (1000-duration);