Java: GUI-приложение с фоновым потоком - PullRequest
1 голос
/ 24 февраля 2010

РЕДАКТИРОВАТЬ : чтобы прояснить ситуацию -

У меня есть приложение, которое подключается к удаленному серверу и обновляет графический интерфейс. Приложение использует шаблон MVC.

1) Удаленный сервер может отправить сообщение, которое обновляет модель данных моего приложения.

2) Классы контроллера графического интерфейса реализуют интерфейс PropertyChangeListener, прослушивают обновления модели и обновляют классы вида графического интерфейса

3) Приложение может отправлять сообщения обратно на удаленный сервер после действий пользователя в графическом интерфейсе. При этом используется тот же объект, который получает данные с удаленного сервера.

В настоящее время я инициализирую объект 'связь с удаленным сервером' и классы GUI в моем методе main. Поскольку объект связи может обновлять модель независимо, следует ли инициализировать этот объект с помощью SwingUtilities.invokeLater ()?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

Я не совсем уверен, что понимаю вас, но мне все равно есть что добавить -

Убедитесь, что каждый раз, когда вы касаетесь GUI, он находится в потоке AWT. Теоретически это означает даже создание графического интерфейса пользователя (хотя на практике редко возникает проблема с созданием графического интерфейса пользователя в потоке, передаваемом вашему основному или другому потоку, но Sun в один момент обнаружила проблему и предложила против нее)

В любом случае, это означает, что вы используете invokeLater каждый раз, когда хотите обновить графический интерфейс из другого потока. Период.

(Обратите внимание, что всякий раз, когда GUI вызывает вас через обратный вызов (ActionListener и т. Д.), Он всегда будет потоком AWT, поэтому вы можете делать все что угодно с GUI в рамках обратных вызовов.

С вашим исправленным сообщением я могу предположить, что, если у вас есть шанс конфликта потоков и все равно выполняете ввод / вывод в графическом интерфейсе, одним из способов справиться с этим будет выполнение всех ваших "спорных" вещей в invokeLater. 1009 *

Хотя в большинстве случаев допустимо создавать GUI в вашем основном потоке (все, вплоть до setVisible (true) - теоретически), если есть вероятность конфликта из другого потока, invokeLater позаботится обо всем этом. очень детерминированный способ.

1 голос
/ 24 февраля 2010

SwingUtilities.invokeLater () запустит ваш Runnable непосредственно в потоке обработки событий графического интерфейса.

Другими словами, никогда используйте его для запуска фоновых задач, так как он не даст GUI реагировать. Вместо этого подкласс SwingWorker , как показано в учебнике Sun или другом фоне Thread s.

1 голос
/ 24 февраля 2010

У меня такой вопрос: учитывая, что код поставщика инициализирует собственный поток соединения, должен ли я все еще помещать весь свой код удаленной связи (анализ событий, обновление модели, отправка сообщений обратно в удаленное приложение) в явном виде, отдельный поток к коду, который инициализирует GUI?

Да

Если я правильно понимаю, это то, что происходит.

Библиотека вендора запустит собственный поток и в конечном итоге обратный вызов данного метода в вашем коде.

Это обновит ваше приложение. Поток уже используется в сторонней библиотеке, и этого будет достаточно.

Если ваше приложение, в свою очередь, должно взаимодействовать с удаленным сервером поставщика, вам нужно будет использовать свой собственный поток. Тогда ответ - да.

Если вы просто «реагируете» на то, что отправляет вам библиотека поставщика, то отдельный поток не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...