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

Java 获取锁定对象线程正在等待,java,multithreading,concurrency,Java,Multithreading,Concurrency,如何获取正在等待的锁定对象 我有线程转储,我可以看到一个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)

如何获取正在等待的锁定对象

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

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

请参阅该方法


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

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

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

基本上锁有一个等待它的线程列表, 这里的锁是对象的锁,因此它是监视器对象

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


您可能会发现以下打印输出很有用,请尝试使用线程获取监视器列表,并在释放锁之前进行打印(例如监视器的方法->查看方法),同时确保每个线程在获取之前写入其id,这两者都可能导致不正确的临时值,但结合起来,它会给你们一个需要的指示。

基本上锁上有一个等待它的线程列表, 这里的锁是对象的锁,因此它是监视器对象

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


您可能会发现以下打印输出很有用,请尝试使用线程获取监视器列表,并在释放锁之前进行打印(例如监视器的方法->查看方法),同时确保每个线程在获取之前写入其id,这两者都可能导致不正确的临时值,但结合起来,它会给你一个指示,你的需要。

我试图找到锁,以防我有一个(参考)线程,但不是相反。欢迎登机;)tnx,对象有一个名为_lock的私有字段,您可能无法从高层显式访问和操作它(可以从jvm语言中访问),并且可以通过关键字synchronized和其他方法隐式访问它,如果你被允许->死锁\livelock和更多的东西将会更常见,也更难追踪我正在尝试寻找锁,以防我有一个(引用)线程,但不是相反。欢迎登机;)tnx,对象有一个名为_lock的私有字段,您可能无法从高层显式地访问和操作它(可能可以从jvm语言中访问),并且它是通过关键字synchronized和您已经知道的其他方法隐式访问的,如果您被允许->deadlock\livelock和其他方法,它将更常见,更难跟踪