2011-01-27 3 views
2

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

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

ответ

5

В Swing могут возникать проблемы с резьбой между Event Dispatch thread и другой логикой. Как правило, плохая идея запускать длинный код на EDT, поскольку это означает, что пользовательский интерфейс выглядит так, будто он заблокирован, когда он просто ждет запуска кода. Решением этого является запуск долгого кода в ProgressWorker, который создает новый поток.

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

3

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

3

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

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

3

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

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

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

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

source

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