要約:オリジナルソースhttps://studyidea.cn「公開番号:プログラムインタプリタの注意とあなたに感謝し、予約された要約を再印刷する歓迎!
データまでCPUの実行が完了したことを読まれるようにブロックされたスレッドにつながる、データを読み取るためにI / Oモデルをブロック使用Javaは、スレッドは、スリープ状態になります。あなたはこの期間を使用する場合は、スレッドの状態を表示するjstackが、それはそこに矛盾があると言っている上、RUNNABLEであるJavaスレッドの状態で見つけることができ、なぜそれはそうでしょうか?
上記の矛盾は、実際のオペレーティングシステムスレッドの状態とJavaスレッドの状態を混同しています。ここでは、スレッドがスリープ状態になるからブロックされていることを、実際には、オペレーティングシステムレベルのスレッドの実際の状態です。そして、我々はjstackビュースレッドの状態がJVMにおけるスレッドの状態で使用します。
スレッドがコンセプトのオペレーティングシステムで、Javaはその包装のために、Javaスレッドは、本質的に、オペレーティングシステムのスレッド、そのステータスとほぼ同じオペレーティングシステムの状態ですが、いくつかの違いがあります。
ここでは、最初におなじみのJavaスレッドの状態を見てください。
Javaスレッド状態
Javaスレッド状態で定義されているThread.State
使用して、列挙thread#getState
現在のスレッドの状態を取得する方法。
Thread.State
図の状態は次のよう:
Javaスレッドはすなわち、6の合計が状態にあります見ることができます:
- NEW(初期状態)
- RUNNABLE(動作状態)
- BLOCKED(ブロック)
- WATTING(待機状態)
- TIMED_WAITING(リミット待ち状態)
- TERMINATED(終了状態)
NEW(初期状態)とRUNNABLE(動作状態)
それぞれの使用new Thread()
スレッドのインスタンスで、新しく作成された状態NEWの状態は、一度呼び出されthread.start()
、スレッドの状態はなるRUNNABLE。
RUNNABLE(動作状態)およびブロック(ブロック)
RUNNABLEスレッドの状態が入っているsynchronized
買収はなるスレッド状態未満であると、暗黙の排他ロックを取得しようとする前変性法やコードのブロックをBLOCKEDロックの取得を待機します、。他のスレッドがロックを解除すると、スレッドが正常にロックをつかむ、それは状態をスレッドしますBLOCKEDにRUNNABLE状態。
RUNNABLE(動作状態)とWATTING(待機状態)
でWATTINGスレッドの状態を無期限に待機している状態であったであろう、我々は他のスレッドが目覚めるのを待つ必要があります。3つの方法の合計はからスレッドになりますがありますRUNNABLEはなっWATTING。
Object#wait
取得スレッドsynchronized
表示呼び出し、暗黙のロックObject#wait()
方法を。他のスレッドがロックを取得し、呼び出すために一度この場合、スレッドは、暗黙のロックを行いますObject.notify()
か、object.notifyAll()
目を覚ますだろうスレッド、その後、RUNNABLE。
Thread#join
join
この方法は、スレッド同期化方法です。私たちはメインメソッド()メソッドではスレッドA.joinを実行すると仮定し、メインスレッドの状態がなるWATTING。終了し、メインスレッドになるまでスレッドはその後になりますRUNNABLE。
LockSupport#park()
LockSupport JDKの同時実行は、オブジェクトに依存しているロックの多くを達成するために、袋の重要な課題です。呼ばれたらLockSupport#park()
、スレッドはなりWATTING状態。あなたがスレッドをウェイクアップする必要がある場合はLockSupport番号のunparkをを呼び出す必要がある場合、スレッドの状態は、バックに変更されRUNNABLE。
RUNNABLE(動作状態)とTIMED_WAITING(リミット待ち状態)
TIMED_WAITINGとWATTINGは、同じ機能が、機能を待っている旧制限の増加、待機期間が満了した後は、スレッドの状態が自動的になりRUNNABLE。次のような状況では、この状態をトリガします。
Thread#sleep(long millis)
- 暗黙のロック同期所持スレッドの呼び出し
Object.wait (long timeout)
方法を Thread#join (long millis)
LockSupport#parkNanos (Object blocker, long deadline)
LockSupport#parkUntil (long deadline)
RUNNABLE(動作状態)TERMINATED(終了状態)
異常と正常でない取得処理の実行中に実行したスレッドまたはスレッドの終了後は、状態が自動的になっていますTERMINATED。
Javaスレッド6つの状態が非常に複雑に見えますが、実際には上記のBLOCKED、WATTING、TIMED_WAITINGは、休眠状態のスレッドを行いますので、我々は、これらの3つのカテゴリが休止状態に分類されています。このような分類は、その後、Javaスレッドのライフサイクルは、次の図に削減することができます。
汎用オペレーティングシステムスレッドの状態
Javaスレッドは、我々は、スレッド一般的なオペレーティングシステムの状態を見て、状態のシステム上に仕上げました。OSスレッドの状態は、以下に示すように、状態、スリープ状態と最終状態を実行して、状態を実行し、初期状態に分割することができます。
下記のとおり、この状態5:
- 初期状態では、スレッドが作成された直後、この時間は、それがCPUを割り当てることができません。
- 実行可能スレッド待っているシステムは、タスクを実行するために、CPUを割り当てます。
- 動作状態、オペレーティングシステムのCPUがスレッドに割り当てられ、スレッドはタスクを実行します。
- ハイバネーションは、あなたがそのようなファイルを読むための方法を阻止するよう、APIを遮断呼び出す場合、スレッドは休眠状態になりますスレッドの下で実行されています。この場合、スレッドがCPUを使用する権利を許可します。休眠終了、スレッドの状態は、実行するための第一の状態になります。
- スレッドの実行終了または実行が、この状態のスレッドのミッションが終了した、異常終了状態にスレッド行われます。
2つのスレッドの状態とのコントラスト
Javaスレッドとオペレーティング・システムのスレッドの比較では、あなたはJavaスレッドの状態ではありません見つけることができます実行可能。そのJavaスレッドRUNNABLE状態とランニングを実行するためのオペレーティングシステムを含む状態、。でRUNNABLE Javaスレッドの状態、オペレーティングシステムレベルのステータスが実行されて、システムがCPUを使用する権利を待って割り当てます。
加えて、Javaスレッドは、に分割オペレーティングシステムのハイバネーション、決裂BLOCKED、WATTINGを、TIMED_WAITING 3つ。
スレッドは、ブロッキングAPIを呼び出すと、スレッドがスリープ状態になる、ここでは、オペレーティング・システム・レベルを指します。JVMレベルから、Javaスレッドの状態はRUNNABLE状態のままです。JVMは、オペレーティングシステムスレッドの実際の状態を気にしません。それは、(オペレーティングシステムスレッドの状態がスリープ状態にある)を右JVM(オペレーティングシステムスレッドの状態が実行可能状態である)から、CPUの使用を待っていると、I / Oを待つことは変わりありませんようですので、実行可能状態に分類され、リソースを待っています。
他のJavaスレッドの状態と作動するスレッドのような状態。
インタビュアー:Javaスレッドの状態はRUNNABLEである理由、スレッドのスリープを行いますI / Oモデルをブロックすると言いますか?