Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Какие преимущества у InvokeLater


Автор: COVD 17.8.2007, 19:34
В примерах Swing GUI встречается следующая конструкция, используемая, когда надо сделать какие-то действия (наверное, поменять цвет, например). Создается обьект и ставится в очередь на выполнение. Это похоже на сервис , предоставляемый java.util.concurrent.Executors , но используется системный поток.  Интересны мнения и комментарии -  насколько это желательно применять и в каких случаях (только ли связаное с GUI).

Код

                java.awt.EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        // do something
                    }
                });

Автор: lando1 18.8.2007, 21:22
Я например его использую в случае, когда есть какой-то длинный процесс в основном потоке и надо отобразить его статус в свинге - 
если просто писать setValue в прогресс баре - то он обновиться только когда процесс завершиться.

Автор: COVD 20.8.2007, 16:13
Цитата

если просто писать setValue в прогресс баре - то он обновиться только когда процесс завершиться.


возможно, кроме setValue надо еще validate() было делать, тогда бы и основной поток обновил.

Я предполагал, что если все действия с визуальными компонентами поместить в один поток, то это снимет проблемы с синхронизацией. Собственно, так и оказалось. На rsdn в теме "Swing, нитевая безопасность и Эккель" приведена цитата из документации:

Цитата

"In general Swing is not thread safe. All Swing components and related classes, unless otherwise documented, must be accessed on the event dispatching thread."


Практически все компоненты, кроме ТехтField.setText() , требуют синхронизации или их надо трогать из одного потока. Если действия инициированы например нажатием кнопки на интерфейсе, то они выполняются в потоке AWT-EventQueue и не требуют синхронизации (в предположении, что такой поток один). А вот если внешний поток, то правильнее использовать java.awt.EventQueue.invokeLater или SwingUtilities.invokeLater .

Это все описано в http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html
 



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)