web-dev-qa-db-ja.com

VisualVM-スレッド状態

VisualVMのSleepingWaitPark、およびMonitorの各スレッド状態の違いについて教えてください。

enter image description here

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

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

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

この点で誰かが私を導くことができますか?.

ありがとう。

67
Ali Shah Ahmed

私はグーグルを使用しており、最初に表示されたページには、必要な/知りたいことをほとんど説明した非常に素晴らしい図がありました。次回は、これらのタイプの質問に対してGoogleを試す価値があります。

enter image description here

1)新規

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

2)実行可能

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

3)ランニング

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

4)時限待ち

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

  • Thread.sleep(sleeptime)
  • Object.wait(timeout)
  • Thread.join(timeout)
  • LockSupport.parkNanos(タイムアウト)
  • LockSupport.parkUntil(timeout)

5)実行不能(ブロック)

これは、スレッドがまだ生きている状態ですが、現在実行する資格がありません。

6)終了

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

これがあなたの質問に答えることを願っています:)。

駐車場:

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

スレッドは、実行する許可を持っていないため、この方法で呼び出したい場合、パークまたは一時停止されています。許可が与えられると、スレッドはパーク解除されて実行されます。

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

45
Maciej Cygan

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スレッドの状態は here にあります。

追加するように編集:

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

31
Jeremy