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