Windows Media Playerで CDを機構と思うと、当然音楽が流れてきます。また、画面上に面白い模様のようなものが常に動いて表示されていますね。さらにツールバーから設定を参照したり変更したりすることも出来ます。
当然のように感じるかもしれませんが、これは Windows Media Playerが同時に以下の作業を並行して実行できるからこそ実現できているのです。このように 1つのプログラム上でいくつもの処理を同時に実行しているプログラムを
マルチスレッドプログラム と言います。
簡単なJavaアプリケーションでは・・・
Javaアプリケーションを起動するには、javaコマンドで実行したいクラス名を指定します。Javaコマンドが実行されると JVMは新たにスレッドを生成し、そのスレッドで指定したクラスの main() メソッドを実行します。 main() メソッドの実行が終了すると作成されたスレッドも消滅します。
つまり一つのスレッドで処理を行うシングルスレッドプログラムになります。 マルチスレッドプログラミングというと敷居が高く感じるのですが、Javaでは非常に簡単な方法でスレッドを生成し、さらには同期をとる方法も提供しています。次からはスレッドを生成する方法を見てみます。
マルチスレッドと言いますが、実際のところ CPUは一つしかないので同時に複数のスレッドを実行することは出来ません。そこで、CPUの処理時間を非常に短い単位に分割し、複数のスレッドに順番に割り当てることによって、複数の処理を同時に行っているようにみせているわけです。
並行処理を表わす言葉としてマルチスレッドの以外に、マルチプロセスやマルチタスクがありますが、マルチスレッドはこれらとどう違うのでしょうか。 通常は、プロセスやタスクは OS が管理する大がかりな並行処理機構であるのに対し、スレッドはアプリケーション(JVM も OS から見ればアプリケーション)が管理する軽量級の並行処理を指します。 つまり1つのプロセスの中に複数のスレッドが生成されるという関係になります。
また、プロセスが固有のメモリ空間を持つのに対し、スレッドでは複数のスレッドがメモリ空間を共有しています(ただしスタックは各スレッドごとに持つ)。 したがって、スレッドはプロセスに比べて軽快ですが、変数の操作には警戒を要すると言うわけです。
スレッドのライフサイクル
スレッドには、実行中であるとか、実行待ちであるとかいくつかの状態があります。(下図)
ある状態からある状態へ変わることを
遷移と呼びますが、遷移可能な状態は矢印が記述されている方向になります。どのような状態があって、どのようなタイミングで遷移するのか、以降の説明と見比べながら読み進んでください。
実行状態
実行状態のスレッドとは、今まさに CPU資源を使用して処理を実行しているスレッドになります。
実行可能状態
実行可能状態のスレッドとは、スレッドが実行状態に遷移できる状態を言います。新規作成されたスレッドや、待機状態から復帰したスレッドがこの状態となります。実行可能状態のスレッドからどのスレッドが次に実行されるかはスレッドの優先度を判断しスケジューラが決定します。
待機状態
実行状態のスレッドが sleep や wait といったメソッドが実行や、入出力動作で待ちが生じたりすると待機状態になります。 待機状態になった原因が取り除かれてもすぐには実行状態にはなりません。 まずは、実行可能状態に移動し、スケジューラーが実行状態にしてくれるのを待つことになります。
まずスレッドはインスタンスが生成されると、新規作成状態になり、start メソッドで起動されると実行可能状態になります。 実行可能状態のスレッドを実行状態にするのは、JVM のスレッドのスケジューラーの仕事であり、プログラマは関与することができません。
また、スレッドの処理が全て終了すると、そのスレッドは終了状態となります。一度終了状態となったスレッドは実行状態に戻ることはありません。