должны ли все методы в классах AWT, то есть не-Swing, вызываться в EDT?

Недавно я узнал, что в самых последних рекомендациях Sun / Oracle говорится, что никакие методы Swing каких-либо объектов Swing, включая конструкторы, не должны вызываться вне EDT.

Применяется ли тот же стандарт строгости ко всем «визуальным» классам AWT? Если нет, то каковы ** правила для них?

позже

re Swing и EDT: обсуждение с 2009 г.

http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-recommend-creating-swing-components-on-the-edt.html

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

Поскольку эти прослушиватели являются асинхронными и реагируют на события (например, изменения свойств), возможно, чтобы эти прослушиватели срабатывали при создании вашего графического интерфейса. В результате некоторые слушатели выполняются в EDT по мере того, как вы строите в своем основном потоке, а некоторые слушатели могут работать и в каком-то другом потоке (потому что слушатель сбит с толку и запускается не в том потоке). Результат - огромный непредсказуемый беспорядок ».

возможно, они не знают, о чем говорят ... но в данный момент я придерживаюсь подхода «лучше перестраховаться, чем сожалеть». Также Поточкин, на http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html, похоже, считает, что мы знакомы с более поздними, более строгими правилами.


person mike rodent    schedule 14.09.2012    source источник
comment
Ваше первоначальное утверждение, что все методы Swing должны вызываться в EDT, неверно. Есть некоторые потокобезопасные методы, которые могут быть вызваны из EDT, например repaint(), и это хорошо задокументировано в Java API. Я не занимаюсь кодированием AWT, но могу представить, что документация по этому поводу будет аналогичной.   -  person Hovercraft Full Of Eels    schedule 14.09.2012
comment
Подробнее об этом см. В этой статье. Кроме того, зачем вообще использовать AWT, а не Swing, или этот вопрос предназначен только для академических целей?   -  person Hovercraft Full Of Eels    schedule 14.09.2012
comment
возможно, вам захочется взглянуть на этот вопрос SO ... stackoverflow.com/questions/11072423/ ... что привело меня на эту страницу: weblogs.java.net/blog/alexfromsun/archive/2006/02/ ... Похоже, что это датируется 2006 годом или позже, тогда как страница, которую вы показали, похоже, относится к 2000 году. Теперь у меня сложилось впечатление, что все методы Swing должны выполняться в EDT. Кроме того, я проверил Component.repaint () в своем API ... нет упоминания о том, что он может быть отозван из EDT ...   -  person mike rodent    schedule 14.09.2012
comment
@Hovercraft, должно быть сильное заявление. Звучит так, будто их нельзя отозвать из EDT. Согласен, зачем использовать AWT? AWT более ограничен, чем Swing.   -  person km1    schedule 14.09.2012
comment
почему AWT? Хороший вопрос. Я просто сейчас переписываю материал на том основании, что все вызовы Swing должны выполняться в EDT ... если AWT немного более разрешительный, это может быть полезно для некоторых простых целей графического интерфейса ...   -  person mike rodent    schedule 14.09.2012
comment
Изменить: комментарий удален и заменен на ответ.   -  person Hovercraft Full Of Eels    schedule 14.09.2012


Ответы (2)


Правильная синхронизация в многопоточной Java-программе зависит от отношения происходит-до, резюмированного в Свойства согласованности памяти. Компоненты AWT были предназначены для обеспечения потоковой безопасности, синхронизируясь с объектом частной блокировки в java.awt.Component. См. Комментарии для некоторой исторической точки зрения:

private transient Object objectLock = new Object();

Хотя для простых программ этого может оказаться достаточно, более сложные программы должны полагаться на знание этой детали реализации для проверки правильности синхронизации. Это возможно, но кто хочет довольствоваться хрупким графическим интерфейсом AWT?

Некоторые дополнительные моменты:

person trashgod    schedule 14.09.2012
comment
спасибо ... на странице Поточкина weblogs.java.net/ blog / alexfromsun / archive / 2006/02 / он конкретно говорит: Изначально существовало правило, согласно которому безопасно создавать и использовать компоненты Swing, пока они не будут реализованы, но это правило больше не действует, и теперь рекомендуется взаимодействовать со Swing только из EDT - к сожалению, ссылка в конце этого утверждения не работает. Хотите прокомментировать? - person mike rodent; 15.09.2012
comment
Я не уверен, когда он был перенесен, но я цитировал связанные страницы из здесь уже несколько лет. - person trashgod; 16.09.2012
comment
Я не понимаю: вы не знаете, когда что было перенесено? Дело в том, что Поточкин - высокопоставленный сотрудник Sun (теперь Oracle, или он уже ушел?), Чья специальность, похоже, связана с Swing. Этот ваш комментарий фактически относится к руководству по Swing, в основном о SwingWorker, и не отвечает ни на вопрос о AWT, ни о ограничении EDT для Swing ... - person mike rodent; 19.09.2012
comment
Я не уверен, когда был перенесен совет EDT. Я ничего не знаю о Поточкине, кроме статей вроде той, которую вы процитировали. Статья, цитируемая в моем комментарии, - это только первая страница следа по теме. Для всех поддерживаемых платформ требуется однопоточный доступ к одноранговым компонентам. Использование AWT не устраняет накладные расходы на параллелизм; он просто затемнит его. - person trashgod; 19.09.2012

Вы заявляете:

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

Мой ответ:
Это плохая аргументация. Качели настолько мощные и гибкие, что это все равно что сломать щенку лапы перед покупкой, чтобы вам не приходилось его выгуливать. Используйте Swing, следуйте правилам потоковой передачи, которые вряд ли будут более обременительными, чем AWT, и наслаждайтесь. Правила потоковой передачи имеют смысл, и им нетрудно следовать. Опять же, эта статья является отличным справочником по этому поводу.

person Hovercraft Full Of Eels    schedule 14.09.2012
comment
спасибо ... я знаком с мощью Swing. Кажется, ваша статья очень старая (2000 г.). Если вас беспокоит просмотр ссылок, которые я дал, могут быть полезны ... - person mike rodent; 14.09.2012
comment
@mike: спасибо за ссылки, и вы правы, правила более строгие, но, опять же, они не являются сложными или трудными. Я пробовал поискать в Google по AWT и мало что могу найти по этому поводу, вероятно, потому, что действительно гораздо меньше написано об AWT за последние 10 лет с тех пор, как Swing затмил его. Я все еще верю своему совету. - person Hovercraft Full Of Eels; 14.09.2012
comment
ты придерживаешься своего совета ... относительно чего? Вы видите, что на самом деле было бы весьма полезно, если бы вы сказали: ах, интересно, правила для Swing теперь более строгие ... эта страница (www.xxx) является окончательным набором правил для Java 6+. Я предполагаю, что единственное, что разрешено в не-EDT, - это статические методы showXXX JOptionPane ... - person mike rodent; 19.09.2012
comment
@mikerodent: нет, даже статические методы showXXX JOptionPane должны вызываться в потоке событий. - person Hovercraft Full Of Eels; 19.09.2012
comment
@hovercraft, кажется, ты прав ... с 2004 года правила меняются. Но тогда это, возможно, сводит их с ума, потому что идея состоит в том, что они блокируют свой вызывающий поток ... и даже модальный диалог должен позволять пульсу EDT продолжать биться. Если, конечно, их вызов в EDT не заставит другой насос диспетчеризации событий заработать ... хм. Необходимо изучить ... Спасибо, что указали на это. - person mike rodent; 21.09.2012