Преимущества потоков в программировании на Java

потоки для программиста Java

При надлежащем использовании потоки позволяют снизить стоимость разработки и обслуживания, а также повысить производительность сложных приложений на Java. Они превращают асинхронные потоки информации в преимущественно последовательные, а запутанный код — в прямолинейный.


Оглавление статьи[Показать]


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

1. Задействование множества процессоров

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

Программа с одним потоком может работать не более чем на одном процессоре один раз. Это означает, что в двухпроцессорной системе однопоточная программа отказывается от доступа к половине процессорных ресурсов, а в 100-процессорной системе — от доступа к 99 % ресурсов. Очевидно, что более эффективно использовать процессорные ресурсы смогут многопоточные программы.

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

2. Простота моделирования

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

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

По такому принципу работают структуры, такие как сервлеты. Они обрабатывают сведения об управлении запросами, создают потоки и балансируют нагрузку, направляя части обработки запросов к соответствующим компонентам приложения на соответствующих этапах процесса. Метод service сервлета может обрабатывать запрос как однопоточная программа, упрощая разработку компонентов структуры.

3. Упрощенная обработка асинхронных событий

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

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

Исторически сложилось так, что операционные системы устанавливали ограничения на количество потоков, которые мог создавать процесс, — допускалось всего несколько сотен (или даже меньше). В результате получили развитие механизмы мультиплексированного ввода-вывода, такие как системные вызовы Unix select и poll. В целях доступа к этим механизмам библиотеки классов Java приобрели набор пакетов java.nio. Однако сегодня операционные системы поддерживают увеличение числа потоков с помощью модели «один поток в расчете на клиента».

4. Более отзывчивые пользовательские интерфейсы

Приложения с графическим пользовательским интерфейсом (GUI) раньше были однопоточными, и приходилось либо часто опрашивать весь код на наличие входных событий (запутанное и утомительное занятие), либо выполнять весь код приложения косвенно, через главный событийный цикл. Если код, вызываемый из главного событийного цикла, выполнялся слишком долго, пользовательский интерфейс «замораживался».

Современные структуры GUI, такие как инструментальный пакет AWT и платформа Swing, заменяют главный событийный цикл потоком диспетчеризации событий (event dispatch thread, EDT). Когда происходит событие пользовательского интерфейса, такое как нажатие кнопки, в потоке событий вызываются соответствующие обработчики. Большинство структур GUI являются однопоточными подсистемами, поэтому главный событийный цикл в них по-прежнему присутствует, но он выполняется в собственном потоке под управлением инструмента GUI, а не приложения.

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

Вас заинтересует / Intresting for you:

Распространенные заблуждения о...
Распространенные заблуждения о... 2481 просмотров Ирина Светлова Thu, 21 Jun 2018, 18:35:12
Использование потоков в Java
Использование потоков в Java 1445 просмотров Antoni Wed, 12 May 2021, 09:51:36
В чем опасность при использова...
В чем опасность при использова... 1006 просмотров Antoni Mon, 10 May 2021, 07:44:45
Пример написания программы на ...
Пример написания программы на ... 25824 просмотров Светлана Комарова Wed, 07 Nov 2018, 08:24:40
Войдите чтобы комментировать