Swing - параллелизм в типичном настольном приложении - PullRequest
2 голосов
/ 27 января 2011

Это, вероятно, широкий вопрос, но я хотел бы знать, где параллелизм обычно используется для настольных приложений с одним пользователем.Как определить случай (в идеале, на стадии проектирования), когда могут возникнуть проблемы с параллелизмом?

PS: Исходя из теории ОС, я бы сказал, что проблемы с параллелизмом обычно возникают, когда ресурс не может использоваться совместно (например,: принтер).Я все еще не знаю, где это может произойти на уровне программирования.

Ответы [ 4 ]

5 голосов
/ 27 января 2011

В Swing могут быть проблемы с многопоточностью между Потоком диспетчеризации событий и другой логикой.Обычно плохая идея запускать долго работающий код на EDT, поскольку это означает, что пользовательский интерфейс выглядит заблокированным, когда он просто ожидает выполнения кода.Решением этой проблемы является запуск длинного кода в ProgressWorker, который создает новый поток.

Здесь мы можем получить проблемы.Если и рабочий поток, и поток EventDispatch изменяют вещи одновременно, могут возникнуть проблемы с параллелизмом (представьте, что цикл выполняется по списку, в то время как другой поток изменяет его).Однако обычно это не проблема, так как хороший код свинга в любом случае будет изменять только компоненты Swing из нити диспетчеризации событий.

3 голосов
/ 27 января 2011

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

Как вы определяете дело (в дизайне этап, в идеале) где параллелизм могут возникнуть проблемы?

вы можете определить места, где происходят ресурсоемкие операции (например, загрузка изображений), и поместить их в поток Swingworker.

  • трудоемких задач не должно быть запустить в потоке рассылки событий. В противном случае приложение становится отвечать на запросы.
  • Качели должны быть доступ только в потоке рассылки событий.

источник

3 голосов
/ 27 января 2011

Вообще говоря, это когда необходимо выполнить долгосрочное задание, чтобы, если бы оно было выполнено в потоке диспетчеризации событий, оно заметно заблокировало бы его при завершении. Таким образом, захват страниц из Интернета, интенсивная обработка, дисковый ввод-вывод и т. Д. Будет лучше не в потоке отправки событий, а в виде отдельных потоков.

Незначительно выходит за рамки, но обычно лучший инструмент для решения этих ситуаций - SwingWorker , который позволяет запускать задачу в отдельном потоке и уведомлять свинг о ее ходе и завершении в поточно-безопасном режиме. образом.

3 голосов
/ 27 января 2011

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

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