まず最初に、インターネットで言及されている 5 つの状態は誤解を招くものであることをお伝えしておきます。Java のスレッドには実際には 6 つの状態があります。 「5 つの状態」という用語は、実際には初期プロセスの状態を指します。
初期のプロセスステータス:
ここでのいわゆる「プロセスステータス」は、初期の「シングルスレッドプロセス」ステータスを指します。
現在一般的な「マルチスレッドプロセス」では、「プロセスのステータス」について話すのは明らかに無意味で、「プロセス下のスレッドのステータス」、または直接「スレッドのステータス」について話す必要があります。ただし、「プロセスのステータス」と「スレッドのステータス」が依然として混同される場合があります。
一部のシステムはスレッドを「軽量プロセス」と呼ぶため、ここではまだ「プロセスステータス」について話しています。
場合によっては、「プロセス」や「スレッド」とさえ呼ばれず、「タスク」または「ジョブ」と呼ばれます。
従来の実行状態との違い
Java スレッド状態には実行状態が欠落していると考える人がよくいますが、これは実際には 2 つの異なるレベルの状態を混同しています。 Java スレッドの状態には、いわゆる実行状態は存在せず、実行可能な状態には実行状態も含まれます。
なぜ JVM ではこれら 2 つの状態に区別がないのかと疑問に思うかもしれません。
現在のタイムシェアリング(タイムシェアリング)マルチタスク(マルチタスク)オペレーティングシステムアーキテクチャは、通常、いわゆる「タイムスライシング(タイムクォンタムまたはタイムスライス)」方式プリエンプティブを使用します。 (プリエンプティブ) ラウンドロビン スケジューリング (ラウンドロビン スタイル)。
このタイム スライスは通常非常に小さく、スレッドは一度に最大 10 ~ 20 ミリ秒しか実行できません (実行状態になります)。それ以降のタイム スライスはわずか約 0.01 秒です。 、スイッチがダウンされ、スケジューリング キューの最後に配置され、再度スケジューリングを待機します。 (つまり、準備完了状態に戻ります)
通常、Java のスレッド状態は監視に使用されますが、スレッドがすぐに切り替わる場合、準備完了と実行中を区別するのはあまり意味がありません。
今日の主流の JVM 実装は、Java スレッドをオペレーティング システムの基礎となるスレッドに 1 つずつマッピングし、仮想マシン レベルで見られる状態は、基本的に基礎となる状態のマッピングとパッケージ化です。 JVM 自体は実質的なスケジューリングを行わず、基礎となる準備完了状態と実行状態をマッピングすることにはあまり意味がないため、それらを実行可能な状態に統合することをお勧めします。
以下は、Thread.State ソース コード内のコメントの言葉です:
これらの状態は、仮想マシンの状態であり、オペレーティング システムのスレッドの状態は 反映されません。
これらの状態は仮想マシンの状態であり、オペレーティング システムのスレッドの状態を反映しません。
実行可能状態に関する注意:
実行可能状態のスレッドは Java 仮想マシンで実行されていますが、プロセッサなどのオペレーティング システムからの他のリソースを待っている可能性があります
実行可能状態のスレッドは実行中です。 Java では仮想マシンで実行されますが、プロセッサなど、オペレーティング システムからの他のリソースを待機している可能性があります。 Java の RUNNABLE 状態には、実際には Ready 状態と Running 状態が含まれるため、インターネット上の不正確な記述は完全に無視してかまいません。そのような質問に対する答えは、多くの場合、ソース コードと javadoc にあります。
6 つのステータス:
NEW (新規)RUNNABLE (実行可能)
BLOCKED (ブロックされている)
WAITING (無限待機)
TIMED_WAITING (制限された待機)
TERMINATED (終了)
関連記事:
以上があなたは知っていますか? Javaのスレッドには実際には6つの状態がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。