考虑以下代码:
同时(真){ 一些函数(); 线程睡眠(1000); }
我想要的是,someFunction() 每 10 秒调用一次。但这种情况并非如此。每秒都在调用它。我尝试了 Thread.wait(1000),但即使这样也没有帮助。我删除了 while 部分,只保留了正文,最后写道:
Thread.start();
但是它抛出了异常。还有其他解决办法吗?
每秒都会调用它,因为您休眠了 1000 毫秒,即 1 秒。
将其更改为
Thread.sleep(10000)
,这对您来说会更好。
或者,使用
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
这意味着您不必自己进行算术运算。 (现在许多 API 都接受数量和
TimeUnit
,但不幸的是,似乎没有 Thread.sleep
那样的东西。)
请注意,这将使线程在 10 秒内无响应,并且没有明确的方式告诉它唤醒(例如,因为您想关闭它)。我通常更喜欢使用
wait()
,这样我就可以从不同的线程向同一个监视器发出脉冲来指示“我希望你现在醒来!”这通常来自表单的 while 循环内
while (!shouldStop())
编辑:tvanfosson 使用
Timer
的解决方案也很好 - 另一种替代方法是使用 ScheduledExecutorService
,它可以更灵活一点(并且更容易测试)。
Thread.sleep()
睡眠所需的毫秒数。因此,调用 Thread.sleep(1000)
会休眠 1000 毫秒,即 1 秒。使其Thread.sleep(10000)
,它会休眠 10 秒。
1 秒是 1000 毫秒,所以如果你想要 10 秒 = 10 * 1000 = 10000 毫秒
例如
try {
long numMillisecondsToSleep = 5000; // 5 seconds
Thread.sleep(numMillisecondsToSleep);
} catch (InterruptedException e) { }
您可能想要做的是使用
Timer
并设置函数的计划调用而不是休眠。如果您需要更精确的间隔,您可以跟踪自上次跑步以来已经过去了多长时间,并调整新计时器以防止间隔漂移。请参阅本教程中的简单计时器示例。
我不会详细讨论有关参数精度的问题,因为@Jon 已经介绍过这一点——你需要毫秒而不是秒。
考虑 1000 毫秒为 1 秒。为此,您应该使用 Thread.sleep(10000) 来实现 10 秒内暂停线程。您还可以使用循环来确定线程等待的秒数。 前任。假设您想在半小时(30 分钟)内暂停您的线程。然后使用,
for(i=0;i<1800;i++)
{
Thread.sleep(1000);
}
它将在 30 分钟后暂停您的线程。
我想要的是, someFunction() 是 每 10 秒调用一次。
那为什么要以1000作为参数来调用
Thread.sleep()
呢?这是以毫秒为单位的,所以你明确地说“等待 1 秒”。