Безопасно ли создавать виджеты Swing/AWT НЕ в потоке отправки событий?

StackOverflow https://stackoverflow.com/questions/491323

Вопрос

Я интегрировал Вещество просмотрев мое приложение, я столкнулся с несколькими проблемами, связанными с его внутренними процедурами проверки EDT (Event Dispatch Thread).Substance абсолютно отказывается создавать классы пользовательского интерфейса вне EDT.Я много работал в Swing/AWT и знаю большинство правил, касающихся EDT.Я использую SwingWorker, SwingUtilties.invokeLater для изменения компонентов.Я всегда думал, что эти компоненты могут быть ПОСТРОЕНО вне EDT, но должен быть осуществленный и манипулировали на ЭДТ.Другими словами, вы можете создавать и устанавливать значения по умолчанию в фоновом режиме, но вызов Pack/setVisible должен быть EDT, как и любые последующие вызовы для управления компонентом.

Причина, по которой я спрашиваю, заключается в том, что мне нужно создать особенно «мощное» окно, включающее множество виджетов, состояние и ресурсы (множество значков).Ранее я создал окно в фоновом методе SwingWorker и сделал окно видимым в методе Done.Никогда не было ни одной проблемы.При переключении на Substance меня кусает внутренняя проверка EDT.

Мне удалось провести рефакторинг кода, чтобы обойти эту проблему.Я могу построить EDT, что не является хорошим решением, поскольку все приложение будет заблокировано.Я также могу еще больше провести рефакторинг и постараться загрузить все дополнительные ресурсы за пределами EDT.

Завершаем это...Безопасно ли построить Виджеты Swing/AWT НЕ в потоке отправки событий?

Это было полезно?

Решение

Sun изменила правила в 2004 году — раньше вам разрешалось создавать компоненты вне EDT, и вам нужно было переходить в EDT только после того, как компонент был осуществленный.

Новое правило теперь гласит:

Чтобы избежать возможности тупика, вы должны принять чрезвычайную осторожность, что качели компоненты и модели созданный, изменен, и запрошен только из event-диспетчерская нить.

этот В моем блоге содержится более подробная информация, включая ссылки на другие статьи по теме.обратите внимание, что все официальные Sun Примеры были переписаны и очень строги в этом отношении.

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

Другие советы

Нет.

Простая причина в том, что даже EDT в некоторых редких случаях любит вступать в тупик, и в целом легко заблокировать пользовательский интерфейс при использовании Swing (или мне так сказали).Предлагаю вам прочитать эти три статьи из блога Кирилла (разработчика Substance):

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top