поток блокировки объекта ожидает - PullRequest
0 голосов
/ 05 января 2012

Как я могу получить объект блокировки Поток ожидает?

У меня есть дамп потока, и я вижу, что один 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 ]

3 голосов
/ 05 января 2012

Я недавно опубликовал аналогичный ответ . Хитрость заключается в том, чтобы использовать расширения управления, предоставляемые JDK, на случай, если вас интересует состояние всех запущенных потоков.

1 голос
/ 06 января 2012

В основном у блокировки есть список ожидающих его потоков, блокировка здесь - это блокировка объекта, поэтому это объект Monitor.

, даже если вы получите доступ к списку (что довольно неприятно из-за параллелизма и по соображениям безопасности), почти невозможно гарантировать, что вы будете получать правильный список в определенное время каждый раз.

следующие распечатки могут оказаться полезными, попробуйте получить список мониторов по ниткам, используя его, и распечатайте перед снятием блокировки (например, метод монитора -> См. Метод getObservedObjects(). ), а также убедитесь, что каждый поток записывает свой идентификатор перед получением, оба могут привести к неверным временным значениям, но в сочетании это даст вам указание на ваши потребности.

1 голос
/ 05 января 2012

См. Метод Thread.holdsLock(Object).

AFAICT - это единственный способ определить, удерживает ли поток блокировку определенного объекта; Я не думаю, что есть способ получить программный доступ к объекту, который ожидает поток, не зная, какой из них он может опередить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...