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

使用這些屬性非常方便,因為無需考慮將小時轉換為毫秒。這樣的代碼寫起來和讀起來都舒服多了。

可以在此處閱讀更多詳細信息。