1.Thread.sleep()

您可以在 Java 程序的执行中插入暂停。这通常不是必需的,因为用户希望他们的程序尽快运行。如果你故意放慢你的代码,没有多少人会高兴。

但是作为一名程序员,在很多情况下,代码中的暂停都是有用的。例如,假设您正在编写一个游戏并且希望它每两秒执行一次或每秒执行几次。

基本上,暂停是有用的,所以让我们看看如何为您的代码添加暂停。其实很简单:

Thread.sleep(duration);

duration 暂停的长度以毫秒(1/1000一秒)为单位。

该语句将使您的程序暂停duration 几毫秒。例子:

Thread.sleep(2000);
暂停程序 2 秒。
Thread.sleep(500);
暂停程序半秒钟。
Thread.sleep(60 * 60 * 1000);
暂停程序 1 小时。

下面是如何在实践中使用它。假设我们正在编写一个将发射宇宙飞船的程序。这就是代码的样子:

for (int i = 10; i > 0; i--)
{
   System.out.println(i);
   Thread.sleep(1000);
}

System.out.println("Let's go!");
每一秒,程序都会显示一个数字:10, then 9, then 8, etc.




当计数达到时0,程序会显示 " Let's go!"

2.正确计算停顿

暂停的长度很容易计算。如果你需要程序每秒做一次,那么停顿就是 1000 毫秒。如果每秒 2 次,则暂停 500ms(1000/2)。

如果您需要每秒做 15 次某事,请暂停 66 毫秒 (1000/15)。这一切看起来相当简单:

The duration of one iteration of the loop = 1000 / number of times per second

但这里有一个非常重要的细微差别。尽管许多语句执行得非常快,但它们并不是瞬时的。

看这个。假设您有一个需要 100 毫秒才能完成的操作。您希望每秒执行此操作 5 次。你应该暂停多久?绝对不是 200 毫秒。

对于每秒执行 5 次的操作,我们需要执行操作所需的时间加上暂停持续时间等于 200 毫秒。如果我们这样做,那么它每秒将精确运行 5 次。在我们的例子中,动作需要 100 毫秒,这意味着还有 100 毫秒用于暂停。

pause duration = duration of one iteration of the loop - time required to execute the action

游戏开发人员很清楚执行一个动作所需的时间远高于零。玩游戏的人也是如此。

如果游戏以 20 FPS 运行,这意味着它在一秒钟内只能在屏幕上绘制 20 帧。1000/20产生 50 毫秒。这是在玩游戏时绘制帧所需的时间。



3.纳秒

今天的计算机比创建 Java 时快得多。这意味着 1 毫秒的暂停可能不够精细。

假设我们有一些超简短的动作,我们希望每秒执行 2000 次。我们如何暂停半毫秒?

为此,该方法还有一个变体Thread.sleep()

Thread.sleep(milliseconds, nanoseconds);

此方法使程序休眠指定的毫秒数和纳秒数。

纳秒是百万分之一毫秒。这意味着一个半毫秒的暂停看起来像这样:

Thread.sleep(1, 500_000);

如果你想暂停1/10一毫秒,你需要这样写:

Thread.sleep(0, 100_000);

您现在可能不会在您的程序中使用此方法。但是,了解它而不使用它总比需要它而不了解它要好。



4.TimeUnit

顺便说一句,如果您决定降低应用程序的速度,Java 有另一个类可以让您的生活更轻松。我们正在谈论包TimeUnit中的类java.util.concurrent

请记住,由于该类不在java.lang包中,因此您要么需要添加行import java.util.concurrent.TimeUnit;,要么java.util.concurrent.TimeUnit每次都在代码中编写。

这个类做同样的事情Thread.sleep(),但它更方便:

TimeUnit.HOURS.sleep(15)

此代码将使您的程序休眠 15 小时。分钟、秒、天也可用。以及微秒 (1/1000,000) 和纳秒 (1/1000,000,000)。

该类TimeUnit 具有以下属性:

  • 纳秒:NANOSECONDS
  • 微秒:MICROSECONDS
  • 毫秒:MILLISECONDS
  • SECONDS
  • 分钟:MINUTES
  • 小时:HOURS
  • 天:DAYS

使用这些属性非常方便,因为无需考虑将小时转换为毫秒。这样的代码写起来和读起来都舒服多了。

可以在此处阅读更多详细信息。