スレッドの制御の勉強の続き。
スレッドの休止を行うには、sleepメソッドを使います。sleepはThreadクラスのクラスメソッドで、時間設定の方法は2種類。
- sleep(long millis) … ミリ秒指定
- sleep(long millis, int nanos) … ミリ秒指定とナノ秒指定
ただし、ナノ秒指定には実際のところほとんど意味がないようなので、基本的にはミリ秒指定のみでよさそうです。
注意点としては、sleepによってスレッドを休止してもロックは解放されませんので、ロック解放待ちのスレッドがあると余計に処理時間がかかるようになります。synchronizedブロック内でスレッドを休止させたい場合は、sleepメソッドの代わりにwaitメソッドを使うことも検討したほうがいいそうです。
(waitメソッドについては私は現時点でよくわかってません!)
また、sleepメソッドはクラスメソッドなので、特定のインスタンスに関連づけて呼び出すことはできません!
次に、yieldメソッドです。yieldメソッドは現在処理中のスレッドを一時休止し、他のスレッドに実行の機会を与えます。yieldメソッドもsleepメソッドと同じくクラスメソッドです。休止できるのはyieldメソッドを実行しようとしているスレッド自身だけで、特定のスレッドを指定することはできません。
yieldメソッドは他のスレッドに処理が移るかもしれないけれど、そのスレッド自身も実行可能状態のままです。
(今のところ、使うタイミングわからず…。サンプル探してみるか)
最後にinterruptメソッド。interruptメソッドはスレッドに割り込みを入れるメソッドです。割り込みを入れる事のできるスレッドは、joinやsleepメソッドの実行中によって待機中のメソッド、またはObjectクラスのwaitメソッドで待機中のメソッドです。割り込みを入れられたメソッドはjava.lang.InterruptException例外を発生し、処理を再開します。
本に載っているサンプルでは、sleepを行う場合はtry-catchを行っていて、sleep終了後の処理はInterruptExceptionのcatchブロックで処理を行っているから、このように実装するのが正しいのでしょうか?うーん…。また色々とサンプルを見て勉強しなければ、わからないことが多いです(ーー;)勘違いでした。InterruptExceptionのcatchブロックでは何も処理をしていないサンプルでした。