我怎样才能让锁定对象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)
答案 0 :(得分:3)
I posted a similar answer a while back。诀窍是使用JDK提供的管理扩展,以防您对所有正在运行的线程的状态感兴趣。
答案 1 :(得分:1)
请参阅Thread.holdsLock(Object)
方法。
AFAICT这是确定线程是否持有特定对象锁定的唯一方法;我不认为有一种方法可以以编程方式访问线程正在等待的对象,而不知道它可能是提前哪一个。
答案 2 :(得分:1)
基本上一个锁有一个等待他的线程列表, 这里的锁是一个对象的锁,因此它是一个Monitor对象。
即使您确实可以访问该列表(由于并发性和安全性原因,这是不可取的),几乎不可能保证您每次都能在特定时间获得正确的列表。
您可能会发现以下打印输出有用,请尝试通过线程使用它获取显示器列表并在释放锁之前进行打印(例如,监视器的方法 - >请参阅getObservedObjects()
方法。),以及还要确保每个线程在获取之前都写入了他的id,两者都可能导致不正确的临时值,但结合起来可以指示您的需求。