2012-01-05 3 views
0

ロックオブジェクトThreadがどのように待機していますか?get lockオブジェクトスレッドが待機しています

スレッドダンプがあり、SwingWorkerがユーザー対話を待つinvokeAndWait()を使用して確認ダイアログを開始したことがわかります。
このシナリオをプログラムで検出するにはどうすればよいですか?

"Some swing worker -1-thread-8", WAITING, prio=5, tid=128 
     at java.lang.Object.wait(Native Method) 
     at java.lang.Object.wait(Object.java:485) 
     at java.awt.EventQueue.invokeAndWait(EventQueue.java:1038) 
     at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1326) 
     at ... 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98) 
     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
+2

詳細を教えてください –

答えて

3

I posted a similar answer a while back。このトリックは、実行中のすべてのスレッドの状態に関心がある場合に備えて、JDKが提供する管理拡張機能を使用することです。

1

Thread.holdsLock(Object)の方法を参照してください。

AFAICTこれは、スレッドが特定のオブジェクトに対してロックを保持しているかどうかを判断する唯一の方法です。私は、スレッドが待っているオブジェクトにプログラムでアクセスする方法がないと思っています。

1

基本的には、ロックは彼を待っているスレッドのリストを持っています。 ここのロックはオブジェクトのロックなので、Monitorオブジェクトです。

リストにアクセスしても(並行性とセキュリティ上の理由から)、毎回特定の時刻に正しいリストを取得することはほとんど不可能です。

次のような出力が役立つかもしれません。ロックを解除する前にモニタのリストを取得して印刷してください(たとえば、モニタの方法 - >getObservedObjects()メソッドを参照してください)。また、取得前の彼のIDは両方とも間違った一時的な値になることがありますが、それを組み合わせることでニーズに合ったものになります。

+0

スレッドを参照しているときにロックを見つけようとしていますが、その逆はありません。ようこそ;) –

+0

tnx、オブジェクトは_lockというプライベートフィールドを持っていますので、高レベルから明示的にアクセスしたり操作したりすることはできません(jvm言語からも可能です)。あなたがすでに知っている、もしあなたが許可されていれば、>デッドロック\ライブロックであり、 – shaydel

関連する問題