ホームページ  >  記事  >  Java  >  Java スレッドの状態は何ですか?

Java スレッドの状態は何ですか?

青灯夜游
青灯夜游オリジナル
2020-07-24 11:37:266807ブラウズ

Java スレッドの 5 つの状態: 1. 初期状態。 2. 実行可能状態。実行可能スレッド プール内にあり、CPU を使用する権利を取得するためにスレッド スケジューリングによって選択されるのを待っています。 3. 実行ステータス。 4. ブロック状態は、スレッドが何らかの理由で CPU の使用権を放棄したことを意味します。 5. 死亡状態では、死亡したスレッドを復活させることはできません。

Java スレッドの状態は何ですか?

Java のスレッドのライフサイクルは、大きく 5 つの状態に分類できます。

1. 初期状態 (NEW): 新しいスレッド オブジェクトが作成されます。

2. 実行可能 (RUNNABLE): スレッド オブジェクトが作成された後、他のスレッド (メイン スレッドなど) がオブジェクトの start() メソッドを呼び出します。この状態のスレッドは実行可能なスレッド プール内にあり、CPU を使用する権利を取得するためにスレッド スケジューリングによって選択されるのを待っています。

3. RUNNING: 実行可能状態のスレッドは、CPU タイム スライス (タイムスライス) を取得し、プログラム コードを実行します。

4. ブロック済み: ブロックされた状態は、スレッドが何らかの理由で CPU を使用する権利を放棄したこと、つまり、CPU タイムスライスを放棄し、実行を一時的に停止したことを意味します。スレッドが実行可能状態になるまで、CPU タイムスライスを再度取得して実行状態に移行する機会があります。ブロッキング状況には 3 つのタイプがあります:

(1). ブロッキングの待機中: 実行中のスレッドは o.wait() メソッドを実行し、JVM はスレッドを待機キュー (待機中) に入れます。キュー)真ん中。

(2) 同期ブロック: 実行中のスレッドがオブジェクトの同期ロックを取得するときに、その同期ロックが別のスレッドによって占有されている場合、JVM はそのスレッドをロック プールに入れます。

(3) その他のブロック: 実行中のスレッドが Thread.sleep(long ms) または t.join() メソッドを実行するか、I/O リクエストを発行すると、JVM はスレッドを is in に設定します。ブロッキング状態。 sleep() 状態がタイムアウトになるか、join() がスレッドの終了を待つかタイムアウトになるか、I/O 処理が完了すると、スレッドは実行可能状態に戻ります。

5. 死 (DEAD): スレッドの run() メソッドと main() メソッドの実行が終了するか、例外により run() メソッドが終了すると、スレッドはそのライフサイクルを終了します。 。死んだスレッドを復活させることはできません。

1. スレッド状態図

Java スレッドの状態は何ですか?

##2. 初期状態

実装実行可能インターフェイススレッドはスレッドクラスを取得することができ、新しいインスタンスが出てくるとスレッドは初期状態に入ります

#3. 実行可能状態

#1. 実行可能状態スケジューラーがあなたを選択しなかったとしても、いつでも実行可能です。

2. スレッドの start() メソッドを呼び出すと、スレッドは実行可能状態になります。

3. 現在のスレッドの sleep() メソッドが終了し、他のスレッドの join() メソッドが終了します。ユーザー入力が完了すると、スレッドがオブジェクト ロックを取得し、これらのスレッドも開始されます。実行可能な状態。

4. 現在のスレッドのタイム スライスが使い果たされると、現在のスレッドの yield() メソッドが呼び出され、現在のスレッドは実行可能状態になります。

5. ロック プール内のスレッドがオブジェクト ロックを取得すると、実行可能状態になります。

4. 実行状態

スレッド スケジューラが実行可能プールから現在のスレッドとしてスレッドを選択したときのスレッドの状態。これは、スレッドが実行状態に入る唯一の方法でもあります。

5. 死亡状態

1. スレッドの run() メソッドが完了するか、メイン スレッドの main() メソッドが完了すると、私たちはそれが死んだと考えます。このスレッド オブジェクトは生きている可能性がありますが、個別に実行されるスレッドではなくなります。スレッドが終了すると、復活することはできません。

2. デッドスレッドで start() メソッドを呼び出すと、java.lang.IllegalThreadStateException 例外がスローされます。

6. ブロッキング状態

1. 現在のスレッド T が Thread.sleep() メソッドを呼び出し、現在のスレッドはブロッキング状態になります。

2. 現在のスレッドで実行されている他のスレッド t2 が join() メソッドを呼び出し、現在のスレッドはブロッキング状態になります。

3. ユーザー入力を待機しているとき、現在のスレッドはブロッキング状態になります。

7. 待機キュー (本来は Object のメソッドですが、スレッドに影響します)

1. obj の wait() メソッドと Notice() メソッドを呼び出す前, obj ロックは取得する必要があります。つまり、synchronized(obj) コード セグメントに書き込む必要があります。

2. 待機キューに関連する手順と図

    スレッド 1 はオブジェクト A のロックを取得し、オブジェクト A を使用しています。
  • スレッド 1 は、オブジェクト A の wait() メソッドを呼び出します。
  • スレッド 1 はオブジェクト A のロックを解放し、すぐに待機キューに入ります。
  • ロック プール内のオブジェクトは、オブジェクト A のロックをめぐって競合します。
  • スレッド 5 はオブジェクト A のロックを取得し、同期ブロックに入り、オブジェクト A を使用します。
  • スレッド 5 はオブジェクト A の NoticeAll() メソッドを呼び出し、すべてのスレッドをウェイクアップし、すべてのスレッドがロック プールに入ります。 ||||| スレッド 5 は、オブジェクト A の Notice() メソッドを呼び出してスレッドを起動します。誰が起動されるかは不明です。起動されたスレッドはロック プールに入ります。
  • 同期された notificationAll() メソッドが終了し、スレッド 5 がオブジェクト A のロックを解放します。
  • ロック プール内のスレッドはオブジェクト ロックをめぐって競合しますが、スレッド 1 がいつオブジェクト ロックを取得できるかは不明です。 ||||| ステップ 6 で元のロック プールで目覚めたスレッドは、オブジェクト ロックをめぐって一緒に競合します。

    Java スレッドの状態は何ですか?

#8. ロック プールのステータス

現在のスレッドは同期メソッドを呼び出したいと考えていますオブジェクト A のロックが別のスレッドによって占有されていることが判明したとき、現在のスレッドはロック プール状態に入ります。つまり、ロック プールは、オブジェクト ロックを競合しようとするスレッドでいっぱいになります。

スレッド 1 が別のスレッド 2 によって起動されると、スレッド 1 はロック プール状態に入り、オブジェクト ロックを競合します。

ロックプールは同期環境のみに存在する概念であり、1つのオブジェクトがロックプールに対応します。

9. いくつかのメソッドの比較

Thread.sleep(long millis)、このメソッドは現在のスレッドによって呼び出される必要があります。現在のスレッドはブロッキングに入りますが、ブロッキングに入りません。オブジェクトを解放すると、ロックとミリ秒が経過した後、スレッドが自動的に起動し、実行可能な状態になります。機能: 他のスレッドに実行の機会を与える最良の方法。

Thread.yield()、このメソッドは現在のスレッドによって呼び出される必要があります。現在のスレッドは取得した CPU タイム スライスを放棄し、実行状態から実行可能状態に変更し、OS がもう一度スレッドを立てます。機能: 同じ優先度のスレッドを順番に実行しますが、順番に実行されるという保証はありません。実際には、譲歩スレッドはスレッド スケジューラによって再度選択される可能性があるため、yield() が譲歩の目的を達成するという保証はありません。 Thread.yield() はブロッキングを引き起こしません。

t.join()/t.join(long millis)、現在のスレッドは他のスレッド 1 の join メソッドを呼び出します。現在のスレッドはブロックされますが、スレッド 1 が実行を完了するまでオブジェクト ロックを解放しません。ミリ時間が経過すると、現在のスレッドは実行可能状態になります。

obj.wait()、現在のスレッドはオブジェクトの wait() メソッドを呼び出し、現在のスレッドはオブジェクトのロックを解放し、待機キューに入ります。自動的に起動するには、notify()/notifyAll() を使用して起動するか、待機 (長いタイムアウト) タイムアウトを使用します。

obj.notify() は、このオブジェクト モニターを待機している単一のスレッドを起動します。選択は任意です。 NoticeAll() は、このオブジェクト モニターで待機しているすべてのスレッドを起動します。

推奨チュートリアル:「

java チュートリアル

以上がJava スレッドの状態は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:JVM 入門 第 1 章次の記事:JVM 入門 第 1 章