2010-03-29 97 views
1

考虑下面的代码:如何在java中暂停一个线程?

而(真){ someFunction(); Thread.sleep(1000); }

我想那是什么,someFunction()被调用一次每10秒。但这种情况并非如此。它每秒钟都被调用。我尝试了Thread.wait(1000),但即使这样也没有帮助。我删除了部分,只是保持身体,并在最后写道:

Thread.start();

但它抛出了一个异常。还有其他解决方案吗?

+6

你认为几秒钟之后会有多少毫秒? (提示:它不是100) – 2010-03-29 12:16:11

+0

大声笑。我的错。没有意识到我把1000而不是10000! :) – mithun1538 2010-03-29 12:22:02

回答

14

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

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

另外,使用

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

,这意味着你不必自己做算术。 (很多API现在需要一个数量和一个TimeUnit,但不幸的是Thread.sleep似乎没有类似的东西。)

请注意,这将使线程在10秒内无响应,没有干净的方式告诉它醒来(例如因为你想关闭它)。我通常更喜欢使用wait(),这样我就可以从不同的线程监听同一个显示器,以表明“我希望你现在醒来!”这通常是从以下形式的while循环中

while (!shouldStop()) 

编辑:使用Timer的tvanfosson的溶液也不错 - 和另一个替代方案是使用ScheduledExecutorService其可以是多一点柔性的(和更容易测试) 。

+0

@Jon,我们确定mithun1538完全使用ThreadPool吗? – 2010-03-29 12:24:21

+0

ThreadPool?我没有听说过这个词。我正在开发一个简单的应用程序,所以我猜测我没有使用“ThreadPool”。 – mithun1538 2010-03-29 12:27:29

+0

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/TimeUnit.html#sleep(long \),虽然可能不是非常SoC。此外,该线程可能会被中断唤醒。 – 2012-02-17 19:49:05

3

Thread.sleep()需要数毫秒睡眠。因此,呼叫Thread.sleep(1000)睡1000毫秒,这是1秒。做那Thread.sleep(10000)它会睡10秒。

1

你可能想要做的就是使用Timer并设置一个预定的函数调用而不是睡眠。如果您需要更准确的时间间隔,您可以跟踪自上次运行以来的时间,并调整新的计时器以防止间隔漂移。在这个tutorial看到一个简单的计时器的例子。

我不会详细讨论关于参数精度的问题,因为@Jon已经说明了这一点 - 您需要毫秒而不是秒。

-2

我想要的是,someFunction()是 每10秒调用一次。

那你为什么叫Thread.sleep()与1000作为参数?这是毫秒,所以你明确地说“等待1秒”。

1

1秒为1000毫秒,所以如果要10秒= 10 * 1000 = 10000毫秒

例如

try { 
    long numMillisecondsToSleep = 5000; // 5 seconds 
    Thread.sleep(numMillisecondsToSleep); 
} catch (InterruptedException e) { } 
0

考虑1000毫秒是1秒。为此,你应该使用Thread.sleep(10000)来实现在10秒内暂停你的线程。您也可以使用循环多少秒来等待您的线程。例如,假设你想在半小时(30分钟)内暂停你的线程。然后使用,

for(i=0;i<1800;i++) 
{ 
    Thread.sleep(1000); 
} 

它会在30分钟内暂停您的线程。