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