获取锁定对象线程正在等待

时间:2012-01-05 18:30:36

标签: java multithreading concurrency

我怎样才能让锁定对象Thread等待?

我有线程转储,我可以看到一个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)

3 个答案:

答案 0 :(得分:3)

I posted a similar answer a while back。诀窍是使用JDK提供的管理扩展,以防您对所有正在运行的线程的状态感兴趣。

答案 1 :(得分:1)

请参阅Thread.holdsLock(Object)方法。

AFAICT这是确定线程是否持有特定对象锁定的唯一方法;我不认为有一种方法可以以编程方式访问线程正在等待的对象,而不知道它可能是提前哪一个。

答案 2 :(得分:1)

基本上一个锁有一个等待他的线程列表, 这里的锁是一个对象的锁,因此它是一个Monitor对象。

即使您确实可以访问该列表(由于并发性和安全性原因,这是不可取的),几乎不可能保证您每次都能在特定时间获得正确的列表。

您可能会发现以下打印输出有用,请尝试通过线程使用它获取显示器列表并在释放锁之前进行打印(例如,监视器的方法 - >请参阅getObservedObjects()方法。),以及还要确保每个线程在获取之前都写入了他的id,两者都可能导致不正确的临时值,但结合起来可以指示您的需求。