昨日の続きの学習メモ。
2. スレッドの状態にはどんなものがあるか?
スレッドの状態には次のものがある。
・実行中(Running) すべてのスレッドが目標とする状態
・実行不可能 待機状態、スリープ状態、サスペンド状態、ブロック状態
・実行可能(Ready) 他の条件が整い、CPU時間の割り当てだけを持っている状態
・死んでいる(Dead) すべてが終わった状態
実行中と実行可能状態
実行中のスレッドは、yield()メソッドで実行権を放棄することで、
実行可能状態となる。このとき実行待ちスレッドがスレッドスケジューラにあり、
かつ優先度が高ければ、そのスレッドが実行される。
もしyield()メソッドを呼び出したスレッドの優先度が高かったり、
実行待ちスレッドが無い場合は、yield()メソッドを呼び出したスレッドは実行を続ける。
優先度とは、全てのスレッドに与えられる1から10までの整数で、
この数字が大きいスレッドほど優先的に実行される。
デフォルトの優先度は5であり、
優先度の指定にはsetPriority()メソッド、
優先度を受け取る場合はgetPriority()メソッドでおこなえる。
サスペンド状態
サスペンド(中断)とは、任意のスレッドから他のスレッドを無期限に実行不可能状態にできる仕組みである。
サスペンドされたスレッドは、他のスレッドによってレジューム(再開)されることで実行可能状態に戻る。
しかし、sasupend()メソッドとresume()メソッドの組み合わせと同じ効果は
wait()メソッドとnotify()メソッドを使って、より優れた形で実現できる。
このためsasupend()メソッドとresume()メソッドは現在では非推奨扱いとなっている。
スリープ状態
スリープ状態のスレッドは、何もせずCPUも使用しない。
sleep()メソッドによって指定した時間だけ、実行停止を要求できる。
ブロック状態
入出力を行うメソッドの場合、外界からの出来事を待つ必要があることが多い。
このような動作をブロックと呼び、この出来事を待っているときは
実行中状態から退くべきである。
Javaではブロック動作を行うメソッドがあると、速やかにブロック状態となり
外界からの出来事によりブロックが解除されるか、ブロック条件が変化したとき
実行可能状態に遷移する。
死んだ状態
run()メソッドがreturnすると、スレッドは死んだ状態になる。
この状態から抜け出す方法は存在せず、死んだスレッドは二度と実行できない。
また死んだスレッドはそのまま存在しつづける。
死んだスレッドは実行できないが、他のオブジェクト同様に
データにアクセスしたり、メソッドを呼び出したりすつことはできる。
stop()メソッドによりスレッドを強制終了させ、死んだ状態にすることができるが、
データの破壊やデッドロックを招く恐れがあるため非推奨扱いになっている。
スレッドを他のスレッドから殺す必要がある場合は、
殺す側のメソッドから殺されるスレッドのinterrupt()メソッドを呼び出せばよい。
・・・
本読んでて今更思ったけど
この本マルチスレッドについて全然触れていないなぁ。
あたかも、スレッドは一つしか同時に実行できないから
しっかりと計画練ってね、みたいな書き方がしてある。
索引見てもマルチスレッドの文字は無し。
Javaの特徴として挙げられるくらいだから、
マルチスレッドは当たり前に使えるものだと思っていたけど
もしかしてJavaが出てきた当初は無かったのだろうか?
本が書かれてるのは2001年、Javaが開発されたのは1990年代前半。
無かったことは無いと思うんだけど、どうなんだろう?
もう少し新しい本で引き続き勉強します。
2. スレッドの状態にはどんなものがあるか?
スレッドの状態には次のものがある。
・実行中(Running) すべてのスレッドが目標とする状態
・実行不可能 待機状態、スリープ状態、サスペンド状態、ブロック状態
・実行可能(Ready) 他の条件が整い、CPU時間の割り当てだけを持っている状態
・死んでいる(Dead) すべてが終わった状態
実行中と実行可能状態
実行中のスレッドは、yield()メソッドで実行権を放棄することで、
実行可能状態となる。このとき実行待ちスレッドがスレッドスケジューラにあり、
かつ優先度が高ければ、そのスレッドが実行される。
もしyield()メソッドを呼び出したスレッドの優先度が高かったり、
実行待ちスレッドが無い場合は、yield()メソッドを呼び出したスレッドは実行を続ける。
優先度とは、全てのスレッドに与えられる1から10までの整数で、
この数字が大きいスレッドほど優先的に実行される。
デフォルトの優先度は5であり、
優先度の指定にはsetPriority()メソッド、
優先度を受け取る場合はgetPriority()メソッドでおこなえる。
サスペンド状態
サスペンド(中断)とは、任意のスレッドから他のスレッドを無期限に実行不可能状態にできる仕組みである。
サスペンドされたスレッドは、他のスレッドによってレジューム(再開)されることで実行可能状態に戻る。
しかし、sasupend()メソッドとresume()メソッドの組み合わせと同じ効果は
wait()メソッドとnotify()メソッドを使って、より優れた形で実現できる。
このためsasupend()メソッドとresume()メソッドは現在では非推奨扱いとなっている。
スリープ状態
スリープ状態のスレッドは、何もせずCPUも使用しない。
sleep()メソッドによって指定した時間だけ、実行停止を要求できる。
ブロック状態
入出力を行うメソッドの場合、外界からの出来事を待つ必要があることが多い。
このような動作をブロックと呼び、この出来事を待っているときは
実行中状態から退くべきである。
Javaではブロック動作を行うメソッドがあると、速やかにブロック状態となり
外界からの出来事によりブロックが解除されるか、ブロック条件が変化したとき
実行可能状態に遷移する。
死んだ状態
run()メソッドがreturnすると、スレッドは死んだ状態になる。
この状態から抜け出す方法は存在せず、死んだスレッドは二度と実行できない。
また死んだスレッドはそのまま存在しつづける。
死んだスレッドは実行できないが、他のオブジェクト同様に
データにアクセスしたり、メソッドを呼び出したりすつことはできる。
stop()メソッドによりスレッドを強制終了させ、死んだ状態にすることができるが、
データの破壊やデッドロックを招く恐れがあるため非推奨扱いになっている。
スレッドを他のスレッドから殺す必要がある場合は、
殺す側のメソッドから殺されるスレッドのinterrupt()メソッドを呼び出せばよい。
・・・
本読んでて今更思ったけど
この本マルチスレッドについて全然触れていないなぁ。
あたかも、スレッドは一つしか同時に実行できないから
しっかりと計画練ってね、みたいな書き方がしてある。
索引見てもマルチスレッドの文字は無し。
Javaの特徴として挙げられるくらいだから、
マルチスレッドは当たり前に使えるものだと思っていたけど
もしかしてJavaが出てきた当初は無かったのだろうか?
本が書かれてるのは2001年、Javaが開発されたのは1990年代前半。
無かったことは無いと思うんだけど、どうなんだろう?
もう少し新しい本で引き続き勉強します。