Java - 准确地在给定的毫秒数内重复运行一个函数?

时间:2015-12-04 22:50:09

标签: java time

有没有人能够以精确和准确的毫秒数重复运行函数。我试图通过使用下面的代码尝试每秒一次运行一个名为wave()的函数30秒来完成此任务:

startTime = System.nanoTime();
        wholeTime = System.nanoTime();
        while (loop) {
            if (startTime >= time2) {
                startTime = System.nanoTime();
                wave();
                sec++;
            }
            if (sec == 30) {
                loop = false;
                endTime = System.nanoTime();
                System.out.println(wholeTime - System.nanoTime());
            }
        }

    }

这段代码不起作用,我想知道为什么这段代码不起作用,以及它们是否是解决问题的更好方法。关于如何改进修复上述代码或其他成功解决问题的方法的任何想法都是受欢迎的。谢谢你的帮助!

4 个答案:

答案 0 :(得分:0)

更简单:

long start=System.currentTimeMillis(); // Not very very accurate

while (System.currentTimeMillis()-start<30000)
{
wave();
// count something
}

答案 1 :(得分:0)

答案 2 :(得分:0)

您可以使用https://localhost:9000/view

Thread.sleep()

答案 3 :(得分:-1)

  

有没有人能够以精确和精确的毫秒数重复运行函数。

在标准Java中无法做到这种可靠和准确的事情。问题是,当你想要运行时,你无法保证你的线程会运行。例如:

  • 您的线程可以暂停以允许GC运行
  • 您的线程可以被抢占以允许您的应用程序中的另一个线程运行
  • 操作系统可以暂停您的线程,同时JVM从磁盘取回页面。

如果您在硬实时操作系统和实时Java上运行,则只能获得此类代码的可靠行为。

请注意,这不是时钟精度的问题。真正的问题是调度程序不能为您提供所需的保证。例如,直到X&#34; JVM中的功能可以保证您的线程在X时刻准确唤醒... 任何有用的含义&#34;确切地说&#34;。

其他答案提出了各种方法,但要注意它们在所有情况下都不是(也不可能)可靠和准确的......甚至在运行其他东西以及应用程序的典型机器上也是如此。