如何在java中暂停一个线程?

时间:2010-03-29 12:12:18

标签: java multithreading

请考虑以下代码:

  

while(true){       someFunction();       了Thread.sleep(1000);   }

我想要的是,someFunction()每10秒调用一次。但这种情况并非如此。它每秒都被召唤。我试过Thread.wait(1000),但即使这样也没有用。我删除了while部分,只是保留了身体,最后写道:

  

Thread.start();

但它抛出了一个例外。还有其他解决办法吗?

6 个答案:

答案 0 :(得分:14)

每秒都会被调用,因为你正在睡觉1000毫秒,也就是1秒。

将其更改为Thread.sleep(10000),这对您来说会更好。

或者,使用

Thread.sleep(TimeUnit.SECONDS.toMillis(10));

这意味着您不必自己进行算术运算。 (许多API现在都采用数量和TimeUnit,但遗憾的是Thread.sleep似乎没有。{/ p>

请注意,这将使线程无响应10秒,没有干净的方式告诉它唤醒(例如,因为你想关闭它)。我通常更喜欢使用wait(),以便我可以从不同的线程中向同一个监视器发出脉冲,表示“我希望你现在醒来!”这通常来自表格

的while循环
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()?这是以毫秒为单位,所以你明确地说“等一秒钟”。