VisualVM-スレッドの状態


86

誰かが私との違いを説明してくださいすることができSleepingWaitPark、およびMonitorVisualVMの中スレッドの状態を。

ここに画像の説明を入力してください

これは私が見つけたものです:

Running:スレッドはまだ実行中です。
Sleeping:スレッドはスリープ状態です(スレッドオブジェクトでメソッドyield()が呼び出されました)
Wait:スレッドはミューテックスまたはバリアによってブロックされ、別のスレッドがロックを解放するのを待機しています
Park:パークされたスレッドは許可が与えられるまで中断されます。スレッドのパーク解除は通常、スレッドオブジェクトでメソッドunpark()を呼び出すことによって行われます
Monitor。スレッドは、実行を再開するための条件がtrueになるのを待機しています。

私が理解できないのは州立公園ですが、実際にスレッドを中断しているのは何ですか?スレッドが実行を一時停止した原因をコードで検出するにはどうすればよいですか?

誰かがこの点で私を導いてくれませんか。

ありがとう。

回答:


53

私はあなたが知りたい/知りたいことすべてをほぼ説明しているとても素敵な図を見つけました。

ここに画像の説明を入力してください

  1. 新着

Threadクラスのインスタンスを作成したが、start()メソッドを呼び出す前の場合、スレッドは新しい状態になります。

  1. 実行可能

start()メソッドの呼び出し後、スレッドは実行可能状態になっていますが、スレッドスケジューラはそれを実行中のスレッドとして選択していません。

  1. ランニング

スレッドスケジューラが選択した場合、スレッドは実行状態です。

  1. 時限待機

時限待機は、指定された待機時間で待機しているスレッドのスレッド状態です。指定された正の待機時間で次のメソッドのいずれかを呼び出すため、スレッドは時間指定待機状態になります。

  • Thread.sleep(sleeptime)
  • Object.wait(timeout)
  • Thread.join(timeout)
  • LockSupport.parkNanos(タイムアウト)
  • LockSupport.parkUntil(timeout)
  1. 実行不可(ブロック)

これは、スレッドがまだ生きているが、現在実行する資格がないときの状態です。

  1. 終了しました

run()メソッドが終了すると、スレッドは終了状態またはデッド状態になります。

うまくいけば、これはあなたの質問に答えます:)。

パーキング:

許可が利用可能でない限り、スレッドスケジューリングの目的で現在のスレッドを無効にします。

実行する権限がないため、このように呼び出す場合、スレッドはパークまたは一時停止されています。許可が与えられると、スレッドはパーク解除されて実行されます。

LockSupportの許可はスレッドに関連付けられ(つまり、許可は特定のスレッドに与えられます)、累積されません(つまり、スレッドごとに許可は1つしか存在できず、スレッドが許可を消費すると、許可は消えます)。


お返事をありがとうございます。私もこれを経験しましたが、どういうわけか私の質問はまだ答えられていませんでした。もう一度私の質問に答えていただけませんか。更新しました。公園の状態についての答えを特別に探しています。
Ali Shah Ahmed 2014

更新していただきありがとうございます。それで、公園の状態で、スレッドはそれがスケジュールされるのを待っていますか、それとも何らかの条件で待っていますか?
Ali Shah Ahmed 2014

@AliShahAhmedスレッドは、許可(条件)の実行を待機しています-この条件が一定期間満たされない場合、タイムアウトに達し、スレッドが終了します-PS。
ハハへの

40

VisualVMは、Javaスレッドの状態(@Maciejの回答で説明されている)を、次のようにUIに表示される状態にマップします。

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

SleepingおよびPark(時限)待機の特定のケースです:

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(マッピングはで実行されThreadMXBeanDataManager.javaます。)

Javaスレッドの状態に関する簡単な(そして信頼できない)議論はここにあります

追加するために編集:

ネイティブメソッドの呼び出しでブロックされているスレッドは、JVMではとして表示RUNNABLEされるため、VisualVMによってRunning(および100%CPUを消費しているとして)報告されることにも注意してください。


3
これが正解です。問題は、JVMスレッドの状態ではなく、JVisualVMのスレッドの状態に関するものでした。
digital_infinity
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.