実は同時にスレッドが動くといっても、普通のパソコンはCPUが1つなので、本当の意味で同時に
複数のスレッドが動いているわけではありません。1つめのスレッドがちょっと動いたら、次に2つめの
スレッドがちょっと動き、さらに1つ目のスレッドが・・・。というように人間がわからないくらいの
短時間の間に交互に動くのです。これをタイムディビジョン(時分割)方式と言います。他にもいろいろな
方式がありますが、詳細は省略します。
ちょっと専門的な話になりますが、スレッドには「実行状態」、「待機状態」、「実行可能状態」の
3つの状態があり、その関係は数のようになっています。
- 実行状態
- 実行状態とは、まさに今、実行されているスレッドです。
- 待機状態
- 待機状態とは、通信の返事が帰ってくるまで待つとか、キーボードの入力待ちなどイベントを
待ったり、イベントが終了するまで待っている状態。もしくは何もすることが無い状態です。
- 実行可能状態
- 実行可能状態とは、待機状態でイベントが終了し、いつでもスレッドが実行状態に
移れる状態を言います。本当ならばすぐに実行になりたいのですが、別のスレッドが実行中の場合は、この実行可能
状態で一時待つ感じになります。
新しいスレッドができた場合は、実行可能状態になり、実行されるのを待ちます。今実行されているスレッドが
切がよくなったところで、作られたスレッドは実行中になります。あまり長い間実行していると他のスレッドが動けなく
なるので、しばらくすると実行可能状態に戻されます。もしくはキーボードからの入力待ちなどがあると待機状態に
なります。待機状態でイベントが終了すると実行可能状態になりますが、直接実行中状態になることはありません。
スレッドが破棄されるのは、基本的には実行中からそのスレッドの仕事が終わった時に破棄されます。基本的には
というのは、OS(この場合JVM)や他のスレッドから強制的に削除されるような特殊な場合は待機状態などから
破棄されることもあります。
このことは実際にプログラムする時にはあまり意識しなくても作れますが、情報処理技術者試験には
まず出題されますので、試験を受ける方はきちんと覚えておいてください。また、この状態遷移図は
Javaに限らず、ほかのOSでも同様のことが言えます。
WindowsやMacなどでは、先に説明しました時分割の機能がありますが、Javaは他のプラットフォームでも
動きます。しかし他のプラットフォームのCPUが時分割をサポートしているとは限りません。この場合、
スレッド優先順位が高いスレッドが終了するまで優先順位の低いスレッドは動けなくなる場合がありますので、
注意が必要です。