Потоки и взаимоблокировки в приложении Swing - PullRequest
2 голосов
/ 21 марта 2012

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

Трассировка потока показывает, что между двумя потоками, AWT-EventQueue-0 и AWT-EventQueue-1 возникает тупик.Мой первый вопрос: какой из них является печально известным потоком диспетчеризации событий.Оба потока имеют следующее в нижней части трассировки стека:

at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

Я думаю, корень проблемы в том, что классы приложения смешивают данные домена с графическими компонентами, и в этом случае оба потока пытаютсязаблокируйте и java.awt.Component$AWTTreeLock и один из моих собственных объектов (скажем, X).Мой обходной путь - использовать SwingUtilities.invokeLater() в одном месте, где X заблокирован, хотя это уже на EDT.Согласно Javadoc это означает, что вызов «отложен до обработки всех ожидающих событий».Однако я не совсем уверен, что это действительно решение, и в любом случае мне непонятно, почему, кажется, есть два EDT.

Может кто-нибудь объяснить, что происходит?Я могу попытаться предоставить сокращенную версию кода, но мне может потребоваться некоторое время, чтобы отредактировать несущественные сложности.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Спасибо Ишаю за то, что он указал мне правильное направление.Приложение создает свой собственный подкласс java.awt.EventQueue и использует Toolkit.getDefaultToolkit().getSystemEventQueue().push(newQueue) для замены исходной очереди.Исходная очередь по-прежнему должна обрабатывать задачу в своем потоке AWT-EventQueue-0 одновременно с началом поступления событий в новую очередь в потоке AWT-EventQueue-1, что приводит к взаимоблокировке.

0 голосов
/ 21 марта 2012

Вы создаете темы где-нибудь?Если да, рассмотрите возможность использования

http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html

или

http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

, которые хорошо работают с Swing.

...