有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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)

共 (3) 个答案

  1. # 2 楼答案

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

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

    您可能会发现以下打印输出很有用,请尝试使用线程获取监视器列表,并在释放锁之前进行打印(例如监视器的方法->;请参阅^{}方法),并且还要确保每个线程在获取之前都会写入自己的id,这两种情况都可能会导致临时值不正确,但结合起来,它会指示您的需要

  2. # 3 楼答案

    请参阅^{}方法

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