java中如何暂停线程?

问题描述 投票:0回答:7

考虑以下代码:

同时(真){ 一些函数(); 线程睡眠(1000); }

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

Thread.start();

但是它抛出了异常。还有其他解决办法吗?

java multithreading
7个回答
16
投票

每秒都会调用它,因为您休眠了 1000 毫秒,即 1 秒。

将其更改为

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

或者,使用

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

这意味着您不必自己进行算术运算。 (现在许多 API 都接受数量和

TimeUnit
,但不幸的是,似乎没有
Thread.sleep
那样的东西。)

请注意,这将使线程在 10 秒内无响应,并且没有明确的方式告诉它唤醒(例如,因为您想关闭它)。我通常更喜欢使用

wait()
,这样我就可以从不同的线程向同一个监视器发出脉冲来指示“我希望你现在醒来!”这通常来自表单的 while 循环内

while (!shouldStop())

编辑:tvanfosson 使用

Timer
的解决方案也很好 - 另一种替代方法是使用
ScheduledExecutorService
,它可以更灵活一点(并且更容易测试)。


3
投票

Thread.sleep()
睡眠所需的毫秒数。因此,调用
Thread.sleep(1000)
会休眠 1000 毫秒,即 1 秒。使其
Thread.sleep(10000)
,它会休眠 10 秒。


1
投票

1 秒是 1000 毫秒,所以如果你想要 10 秒 = 10 * 1000 = 10000 毫秒

例如

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

1
投票

您可能想要做的是使用

Timer
并设置函数的计划调用而不是休眠。如果您需要更精确的间隔,您可以跟踪自上次跑步以来已经过去了多长时间,并调整新计时器以防止间隔漂移。请参阅本教程中的简单计时器示例。

我不会详细讨论有关参数精度的问题,因为@Jon 已经介绍过这一点——你需要毫秒而不是秒。


0
投票

考虑 1000 毫秒为 1 秒。为此,您应该使用 Thread.sleep(10000) 来实现 10 秒内暂停线程。您还可以使用循环来确定线程等待的秒数。 前任。假设您想在半小时(30 分钟)内暂停您的线程。然后使用,

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

它将在 30 分钟后暂停您的线程。


0
投票

Duration

在 Java 19+ 中,将

Duration
对象传递给
sleep
方法。比计算毫秒数更方便。

Thread.sleep( Duration.ofSeconds( 10 ) )

-2
投票

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

那为什么要以1000作为参数来调用

Thread.sleep()
呢?这是以毫秒为单位的,所以你明确地说“等待 1 秒”。

© www.soinside.com 2019 - 2024. All rights reserved.