イントロダクション
JavaのThread.sleep()
メソッドは、指定された時間(ミリ秒単位)だけ現在のスレッドの実行を一時停止するために使用できます。ミリ秒の引数値は負であってはなりません。それ以外の場合はIllegalArgumentException
がスローされます。
sleep(long millis, int nanos)
は、指定されたミリ秒とナノ秒の数だけ現在のスレッドの実行を一時停止するためにもう一つのメソッドです。許容されるナノ秒の値は0
から999999
までです。
この記事では、JavaのThread.sleep()
について学びます。
Thread.sleepの動作
Thread.sleep()
は、スレッドスケジューラと連携して現在のスレッドを指定された時間だけ待機状態にします。待機時間が終わると、スレッドの状態は実行可能な状態に変更され、CPUの実行を待ちます。現在のスレッドがスリープする実際の時間は、オペレーティングシステムの一部であるスレッドスケジューラに依存します。
JavaのThread.sleepの重要なポイント
- 常に現在のスレッドの実行を一時停止します。
- スレッドがスリープしてから起きて実行を開始する実際の時間は、システムのタイマーやスケジューラに依存します。静かなシステムでは、指定されたスリープ時間に近い実際の時間がかかりますが、忙しいシステムでは、少し長くなります。
Thread.sleep()
は、取得したモニターを失ったり、現在のスレッドをロックしたりしません。- 他のスレッドがスリープ中の現在のスレッドを割り込むことができ、その場合は
InterruptedException
がスローされます。
JavaのThread.sleepの例
以下は、Thread.sleep()
がメインスレッドの実行を2秒間(2000ミリ秒)一時停止するために使用される例プログラムです:
package com.journaldev.threads;
public class ThreadSleep {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000);
System.out.println("Sleep time in ms = " + (System.currentTimeMillis() - start));
}
}
まず、このコードは現在のシステム時刻をミリ秒単位で保存します。次に、2000ミリ秒スリープします。最後に、このコードは新しい現在のシステム時刻から前の現在のシステム時刻を引いたものを出力します:
OutputSleep time in ms = 2005
この差が正確に2000ミリ秒ではないことに注意してください。これは、Thread.sleep()
の動作方法とスレッドスケジューラのOS固有の実装によるものです。
結論
この記事では、JavaのThread.sleep()
について学びました。
さらに、Javaチュートリアルで学習を続けてください。
Source:
https://www.digitalocean.com/community/tutorials/thread-sleep-java