2010-02-24 4 views
1

EDIT: Для того, чтобы сделать вещи clearer-Java: GUI приложение с фоновым потоком

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

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

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

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

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

ответ

2

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

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

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

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

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

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

+0

Bill - Спасибо. Я упростил свой первоначальный вопрос, чтобы сделать его более ясным. – Luhar

1

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

Да

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

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

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

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

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

+0

Оскар, спасибо за ваш ответ. Да, приложение также взаимодействует с удаленным сервером. Мне придется подумать о редизайне. – Luhar

1

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

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

Смежные вопросы