考虑到执行时间,如何在每个固定的时间段内调用方法

时间:2014-03-24 03:11:09

标签: java multithreading concurrency

我有一个代码

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之后。怎么实现呢?感谢

3 个答案:

答案 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,依此类推。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,%20long,%20long,%20java.util.concurrent.TimeUnit)

答案 2 :(得分:-1)

您问题的简单答案是衡量使用System.currentTimeMillis()测量差异之前和之后花费的时间。从你想要的等待时间中减去这个差异。

long start = System.сurrentTimeMillis();
// do stuff
long duration = System.сurrentTimeMillis()-start;
Thread.sleep (1000-duration);