考虑下面的代码:如何在java中暂停一个线程?
而(真){ someFunction(); Thread.sleep(1000); }
我想那是什么,someFunction()被调用一次每10秒。但这种情况并非如此。它每秒钟都被调用。我尝试了Thread.wait(1000),但即使这样也没有帮助。我删除了部分,只是保持身体,并在最后写道:
Thread.start();
但它抛出了一个异常。还有其他解决方案吗?
考虑下面的代码:如何在java中暂停一个线程?
而(真){ someFunction(); Thread.sleep(1000); }
我想那是什么,someFunction()被调用一次每10秒。但这种情况并非如此。它每秒钟都被调用。我尝试了Thread.wait(1000),但即使这样也没有帮助。我删除了部分,只是保持身体,并在最后写道:
Thread.start();
但它抛出了一个异常。还有其他解决方案吗?
它每秒都会被调用,因为你正在睡1000毫秒,也就是1秒。
将其更改为Thread.sleep(10000)
这对您会更好。
另外,使用
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
,这意味着你不必自己做算术。 (很多API现在需要一个数量和一个TimeUnit
,但不幸的是Thread.sleep
似乎没有类似的东西。)
请注意,这将使线程在10秒内无响应,没有干净的方式告诉它醒来(例如因为你想关闭它)。我通常更喜欢使用wait()
,这样我就可以从不同的线程监听同一个显示器,以表明“我希望你现在醒来!”这通常是从以下形式的while循环中
while (!shouldStop())
编辑:使用Timer
的tvanfosson的溶液也不错 - 和另一个替代方案是使用ScheduledExecutorService
其可以是多一点柔性的(和更容易测试) 。
@Jon,我们确定mithun1538完全使用ThreadPool吗? – 2010-03-29 12:24:21
ThreadPool?我没有听说过这个词。我正在开发一个简单的应用程序,所以我猜测我没有使用“ThreadPool”。 – mithun1538 2010-03-29 12:27:29
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/TimeUnit.html#sleep(long \),虽然可能不是非常SoC。此外,该线程可能会被中断唤醒。 – 2012-02-17 19:49:05
Thread.sleep()
需要数毫秒睡眠。因此,呼叫Thread.sleep(1000)
睡1000毫秒,这是1秒。做那Thread.sleep(10000)
它会睡10秒。
你可能想要做的就是使用Timer
并设置一个预定的函数调用而不是睡眠。如果您需要更准确的时间间隔,您可以跟踪自上次运行以来的时间,并调整新的计时器以防止间隔漂移。在这个tutorial看到一个简单的计时器的例子。
我不会详细讨论关于参数精度的问题,因为@Jon已经说明了这一点 - 您需要毫秒而不是秒。
我想要的是,someFunction()是 每10秒调用一次。
那你为什么叫Thread.sleep()
与1000作为参数?这是毫秒,所以你明确地说“等待1秒”。
1秒为1000毫秒,所以如果要10秒= 10 * 1000 = 10000毫秒
例如
try {
long numMillisecondsToSleep = 5000; // 5 seconds
Thread.sleep(numMillisecondsToSleep);
} catch (InterruptedException e) { }
考虑1000毫秒是1秒。为此,你应该使用Thread.sleep(10000)来实现在10秒内暂停你的线程。您也可以使用循环多少秒来等待您的线程。例如,假设你想在半小时(30分钟)内暂停你的线程。然后使用,
for(i=0;i<1800;i++)
{
Thread.sleep(1000);
}
它会在30分钟内暂停您的线程。
你认为几秒钟之后会有多少毫秒? (提示:它不是100) – 2010-03-29 12:16:11
大声笑。我的错。没有意识到我把1000而不是10000! :) – mithun1538 2010-03-29 12:22:02