Intereting Posts
Функция Drag / Drop в студии Android не работает Запустить приложение для Android от ссылки браузера Как реализовать вкладки теперь, когда TabActivity устарела Я только что создал небольшой проект Android в Eclipse, какие файлы я должен добавить к управлению версиями? Android, как использовать Environment.getExternalStorageDirectory () Android, Checkbox прослушиватель в XML? Использует Fragment setRetainInstance (true) действительно хорошая практика для обработки изменения вращения Обновить индикатор выполнения в списке для загрузки нескольких файлов Отображение объявления в AndEngine RecyclerView с настраиваемыми элементами Является ли SpannableString.setSpan () вторым parm 0? Создание виджета SearchView с использованием библиотеки поддержки v21 Объект не заблокирован нитью перед уведомлением () в onPostExecute Фрагмент onResume () & onPause () не вызывается в стопку Как установить голографическую темную тему в приложении для Android?

Почему большинство пользовательских интерфейсов однопоточных?

Например, Java Swing и Android UI используют однопоточную модель, в которой один пользовательский поток отвечает за обновление всего пользовательского интерфейса. Что заставило дизайнеров фреймворка выбрать одну модель потока над другой?

Не будет ли многопотоковая модель пользовательского интерфейса потенциально давать вам больше производительности, хотя бы за счет большей сложности? Я понимаю, что последнее – большое дело, потому что связанные с потоком ошибки неприятны, но мне интересно, есть ли другие преимущества для однопоточной модели, кроме простоты?

Solutions Collecting From Web of "Почему большинство пользовательских интерфейсов однопоточных?"

Что заставило дизайнеров фреймворка выбрать одну модель потока над другой?

Из уст лошади :

Первоначально AWT была показана как обычная многопоточная библиотека Java. Но поскольку команда Java посмотрела на опыт работы с AWT и с тупиками и расами, с которыми столкнулись люди, мы начали понимать, что мы обещаем, что не сможем.

Этот анализ завершился одним из обзоров дизайна для Swing в 1997 году, когда мы рассмотрели состояние игры в AWT и общий опыт в отрасли, и мы приняли рекомендацию команды Swing о том, что Swing должен поддерживать только очень ограниченную многопоточность.

(Прочитайте всю статью, она подробно объясняет это решение и заявляет, что точно такие же проблемы и возможный переход к однопоточной модели даже произошли ранее в Xerox PARC – месте, где почти все, что мы рассматриваем, стало кровоточить, современное в CS, было Изобретен 30 лет назад)

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

Абсолютно нет, потому что рисование GUI и обработка пользовательских действий (которые все, что должен сделать поток пользовательского интерфейса), не будут узким местом в любом нормальном 2D приложении.

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

Не в большинстве случаев, и что добавленная сложность принесет больше вреда, чем пользы в большинстве случаев. Вы также должны понимать, что инфраструктура пользовательского интерфейса должна иметь дело с базовой моделью ОС. Конечно, он мог бы обойти модель и отвлечь ее от программиста, но в этом случае это просто не стоит.

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

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

Нет, наверное, нет. По крайней мере, когда вы пытаетесь запустить потоки на CPU. На GPU уже много параллельной обработки в различных формах. Не так много для простой работы графического интерфейса, но для фантазии 3D (затенение, отражение и т. Д.),

Я думаю, что все дело в тупиковой профилактике.

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

Таким образом, это безопаснее.

Не только это, но тот же дизайн был выбран Windows Forms (& .Net), GTK, Motif и другими. Интересно, будет ли Java принуждаться к этому решению базовыми API-интерфейсами ОС, с которыми они взаимодействуют. Конечно, SWT принудительно вступает в эту ситуацию Windows Forms.

Для получения дополнительной информации «EDT» – хорошее место для запуска http://en.wikipedia.org/wiki/Event_dispatching_thread

Для .NET эквивалент SwingWorker известен как BackgroundWorker.

Это связано с природой приложения пользовательского интерфейса.

Вы должны прочитать ввод (мышь или клавиатура), отправить события, позволить им обрабатывать и снова рисовать экран.

Попробуйте сделать это на многопоточном процессе.