1.Thread.sleep()

Java プログラムの実行に一時停止を挿入できます。ユーザーはプログラムをできるだけ早く実行したいと考えているため、これは通常は必要ありません。意図的にコードの速度を遅くしたとしても、喜ぶ人はそう多くはありません。

しかし、プログラマーとしては、コード内で一時停止することが役立つ状況がたくさんあります。たとえば、ゲームを作成していて、2 秒に 1 回、または 1 秒に数回何かを実行したいとします。

基本的に、一時停止は便利なので、コードに一時停止を追加する方法を見てみましょう。実際はとても簡単です:

Thread.sleep(duration);

ここで、はミリ秒 ( 1 秒)duration 単位の一時停止の長さです。1/1000

このステートメントはプログラムをduration ミリ秒間一時停止します。例:

Thread.sleep(2000);
プログラムを 2 秒間一時停止します。
Thread.sleep(500);
プログラムを 0.5 秒間一時停止します。
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!");
プログラムは 1 秒ごとに数字を表示します: 10、次に9、そして という8ように。




カウントが に達すると0、プログラムは「Let's go!」 を表示します。

2. 一時停止を正しく計算する

一時停止の長さは簡単に計算できます。プログラムで 1 秒に 1 回何かを実行する必要がある場合、一時停止は 1000 ミリ秒です。1 秒あたり 2 回の場合は、500 ミリ秒 (1000/2) の間一時停止します。

1 秒あたり 15 回何かを行う必要がある場合は、66 ミリ秒 (1000/15) の間一時停止します。すべては非常に簡単に思えます。

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

しかし、ここには非常に重要なニュアンスがあります。多くのステートメントは非常に高速に実行されますが、瞬時に実行されるわけではありません。

これを見てください。完了までに 100 ミリ秒かかるアクションがあるとします。このアクションを 1 秒あたり 5 回実行したいとします。どれくらいの時間一時停止する必要がありますか? 間違いなく200ミリ秒ではありません。

アクションを 1 秒あたり 5 回実行するには、アクションの実行に必要な時間と一時停止期間を足した時間が 200 ミリ秒になる必要があります。そうすれば、1 秒あたり正確に 5 回実行されます。この場合、アクションには 100 ミリ秒が必要です。つまり、一時停止にはまだ 100 ミリ秒が残っています。

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

ゲーム開発者は、アクションの実行に必要な時間がゼロよりもはるかに長いという事実をよく知っています。ゲームをする人も同様です。

ゲームが 20 FPS で実行される場合、それは 1 秒間に画面上に 20 フレームしか描画できないことを意味します。1000/2050ミリ秒になります。ゲームプレイ中にフレームを描画するのに必要な時間です。



3. ナノ秒

今日のコンピューターは、Java が作成された当時よりもはるかに高速になっています。つまり、1 ミリ秒の一時停止では十分な粒度が得られない可能性があります。

1 秒あたり 2000 回実行したい非常に短いアクションがあるとします。0.5ミリ秒間一時停止するにはどうすればよいでしょうか?

このために、メソッドにはもう 1 つのバリエーションがありますThread.sleep()

Thread.sleep(milliseconds, nanoseconds);

このメソッドは、指定されたミリ秒およびナノ秒の間、プログラムをスリープ状態にします。

ナノ秒は 100 万分の 1 ミリ秒です。つまり、1.5 ミリ秒の休止は次のようになります。

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

これらのプロパティを使用すると、たとえば時間をミリ秒に変換することを考える必要がないため、非常に便利です。このようなコードは、書いたり読んだりするのがはるかに快適です。

詳細については、こちらをご覧ください。