- 4.1. 優先度の設定
- 4.2. スレッドの休止・中断
- 4.3. 推奨されないメソッド
- 4.4. スレッドを停止させるには
4.2. スレッドの休止・中断
ここでは、スレッドの処理を一時休止したり、他のスレッドに割り込みをかけるためのメソッドを説明します。
sleep()
sleepメソッドはThreadクラスのクラス(static)メソッドです。sleepメソッドは指定した時間だけ現在実行中のスレッドを休止させます。sleepメソッドはクラスメソッドのため、sleepメソッドを実行するスレッド以外の別のスレッドを休止することはできません。
sleepメソッドでの時間の指定方法は2種類あります。
- sleep(long millis)
- sleep(long millis, int nanos);
これらのメソッドは、millisミリ秒(1000分の1秒)、またはmillisミリ秒+nanosナノ秒(100万分の1秒)だけスレッドを休止させます。スレッドを休止している間、他に実行可能なスレッドがあれば、そちらに処理が移るかもしれません。ただし、sleepメソッドを呼び出したスレッドは、取得しているロックを解放しません。ロックを確保したままsleepを実行すると、そのロックを取得したいスレッドを必要以上に待たせてしまうおそれがあります。ロックを解放した状態でスレッドを休止させたいときは、次章で説明するwaitメソッドを利用することも検討しましょう。
スレッドは、sleepメソッドで指定した時間経過しても直ちに動作を再開するわけではありません。指定した時間経過後、動作可能な状態にはなりますが、他のスレッドがなにか処理を実行中の場合、そのスレッドの実行が継続されます。sleepメソッドを実行したスレッドは、他の多くのスレッドと同じように、Java仮想マシンによって時間が割り当てられるのを待機します。
sleepメソッドは、休止中に他のメソッドから割り込みがかけられたときにInterruptedExceptionが発生しますので、例外処理を記述しなければいけません。割り込みは、あとで説明するinterruptメソッドによって発生させることができます。
yield()
yieldメソッドは、現在処理中のスレッドを一時休止し、他のスレッドに実行の機会を与えます。Java仮想マシンが複数のスレッドにどのように時間を割り当てるかというのは、実装によってまちまちです。実装によっては、他にも実行可能なスレッドがあるにもかかわらず、あるスレッドからなかなか処理が移らないということがあります。そのようなことを防ぐためにyieldメソッドを用います。
yieldメソッドもsleepメソッドと同じくクラス(static)メソッドです。休止させるスレッドを指定することはできません。休止できるのは、yieldメソッドを実行しようとしているスレッド自分自身だけです。
yieldメソッドはsleepメソッドに似ていますが、sleepメソッドのように休止する時間は指定できません。yieldメソッドを実行すると、他のスレッドに処理が移るかもしれませんが、そのときでもyieldメソッドは引き続き実行可能な状態となります。sleep(0)を呼び出したのと同じような効果があると考えたらよいでしょう。
interrupt()
interruptメソッドは休止中のスレッドに割り込みを入れるメソッドです。割り込みを入れることのできるスレッドは、joinメソッドやsleepメソッドの実行により待機中のメソッド、または次節で説明するObjectクラスのwaitメソッドで待機中のメソッドです。
割り込みを入れられたメソッドは、java.lang.InterruptedException例外を発生し、処理を再開します。