
「こんにちは、アミーゴ!」
「新しいトピック、スレッドを開始します。」
「始めましょう。今日は、スレッドの実行中に Thread オブジェクトが通過する (または通過する可能性がある) 状態を調べます。」
「アミーゴ、今何州の名前を挙げられる?」
「2 つ目。1 つ目は start() メソッドが呼び出される前のスレッドです。オブジェクトは存在しますが、スレッドはまだアクティブではありません。2 つ目は start() メソッドが呼び出された後です。スレッドが何かを実行しているときです。重要。"
「おっしゃる通りです。そのような違いがあります。これらの状態は新規および実行中と呼ばれますが、それは始まりにすぎません。」
「まず、ある時点でスレッドは実行を終了します。これは、Thread オブジェクトは存在するが、スレッドが新規または実行状態ではない状況が存在する可能性があることを意味します。」スレッドが実行を終了したこの状態は、 と呼ばれます。終了しました。」
「しかし、それだけではありません。どの時点でも実際に実行されているのは 1 つのスレッドだけであることを忘れないでください。同時作業のように見えても、実際にはプロセッサが常にスレッドからスレッドにジャンプしています。スレッドが実行されているように見える場合には、別の状態があります。」実行中ですが、実際には順番を待っています。これは、ready-to-runと呼ばれます。スレッドが動作するとき、常に実行中からReadyに切り替わり、再びアクティブになると実行に戻ります。」
start () メソッドが呼び出された直後に、スレッドには実行準備完了ステータスが割り当てられ、JVM が切り替えるスレッドの共有リストに配置されます。
「それはそれほど難しいことではありません。実行を開始する前は新しい状態になります。終了すると終了します。実行中のスレッドは実行状態になります。待機中のスレッドは準備完了状態になります。」 。」
「あなたの簡潔さは驚くべきですが、あなたは正しいです。」
「しかし、それだけではありません。スレッドはブロックされる可能性があります。たとえば、同期ブロックに入ると、スレッドが同期としてマークされたコード ブロックに到達し、別のスレッドがそれを使用している場合、スレッドはブロック状態に入り、待機します。」オブジェクトのミューテックス (ロック) が解放されるようにします。」
「州の状況は次のとおりです。」

「しかし、それだけではありません。待機中と呼ばれる別の状態もあります。これは、スレッドがブロックされていないが、準備ができていない場合でもあります。たとえば、別のスレッドでjoin () メソッドを呼び出した場合などです。」
別の Thread オブジェクトに対して join() を呼び出すと、あたかもスレッドがそのオブジェクトに「参加」しているかのように見えますが、実際には他のスレッドが終了するのを待っているだけです。
「さらに、 wait () メソッド (wait/notify/notifyAll の 3 つのメソッドから)もあり、呼び出されたときにスレッドを待機状態に切り替えます。」
"うわあ。"
「ちょっと待ってください! まだまだ続きがあります。たとえば、スレッドは sleep メソッドを呼び出すことでスリープできます。これには別の状態もあります。これは、« 時限待機» と呼ばれます。 « 時限待機» は、スレッドが何かを待機していることを意味します。制限された時間。wait(timeout) や join(timeout) などのパラメーターを指定して wait メソッドを呼び出すと、スレッドは時間指定待機状態になります。」
「完全な図は次のとおりです。」

「うーん。それだけですか? それとも、さらに 10 個ほど興味深い州があるのでしょうか?」
「今のところはそれだけです。」
「実際には、最初の図を覚えておくだけで済みます。その方が簡単です。しかし、2 番目の図の方が正確です。」
「奇妙なことに、インターネット上にはスレッドの状態図がたくさんありますが、それらはすべて異なります。」
「それが、私がこの図を提示した理由です。これが最も完全で正確です。」
「この図では、準備完了状態と実行状態が runnable と呼ばれる 1 つのブロックに結合されています。その理由はわかりますか?」
「いいえ、そのようなものを見たのは初めてです。」
「Threadクラスには、 Stateという内部クラスと、パブリック State getState()メソッドがあります。」
public enum State
{
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
「いつでもThreadオブジェクトのgetState () メソッドを呼び出して、その現在の状態を確認できます。そしてもちろん、それは State 列挙値の 1 つになります。」
「なるほど。実際の状態は JVM 内にありますが、State getState() メソッドを使用して Java コード経由でアクセスできる状態もあります。」
「そして、どのような状況でそれを使用するのですか?」
「おそらく、決してないでしょう。」
「しかし、スレッド内で何が起こっているのかを知らなければなりません。そうでないと、たくさんのバグが発生し、何が原因なのかを推測することさえできなくなります。」
「さらに、雇用主は面接中にスレッドの状態について尋ねるのが好きです。」