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