русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Java thread

Для некоторых задач удобно организовать параллельное выполнение нескольких частей программы. Каждая из этих самостоятельных подзадач называется потоком (thread). Существует системный механизм, который обеспечивает совместное использованием процессора.

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

При программировании параллельно исполняемых потоков нужно учитывать следующие моменты:

  • Программу можно разделить на несколько независимых задач.
  • Необходимо заранее предусмотреть всевозможные проблемы, возникающие при завершении задач.
  • Задачи, работающие с общими ресурсами, могут мешать друг другу. Основным средством предотвращения конфликтов является блокировка.
  • В неаккуратно спроектированных многозадачных системах возможны взаимные блокировки.

Основные причины использования параллельного выполнения:

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

 

Обрабатывающий  шаблон Worker Thread (Background Thread, Thread Pool) предназначен для улучшение пропускной способности и минимизация средней задержки при реализации параллельного выполнения.

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

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

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

Шаблон Worker Thread рекомендуется использовать когда:

  • нужно повысить пропускную способность приложения;
  • необходимо обеспечить одновременное выполнение разных фрагментов кода.

Для реализации потоков в приложении можно создать новый объект Thread и запустить его на выполнение. Поток, представленный этим объектом, выполнит всю порученную ему работу и автоматически завершится. Однако создание экземпляра потока – это расточительный процесс с точки зрения производительности, он требует немало времени и позволяет выполнить только одну задачу. Более эффективный способ заключается в создании объекта-"долгожителя" – специального обработчика потока, который будет выполнять одну задачу за другой.

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

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

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

Если нет задач для выполнения, обработчик периодически проверяет очередь. Помещение задачи в очередь – гораздо менее требовательный с точки зрения производительности процесс, чем создание нового потока.
Шаблон Worker Thread оказывает влияние на производительность в нескольких направлениях.

  • Клиенту для запуска различных заданий не нужно создавать несколько объектов потоков. Нужно лишь поместить задачу в очередь, что требует значительно меньших накладных расходов, чем создание объекта потока.
  • Существующий, но не выполняющийся поток, снижает производительность, так как планировщик выделяет часть машинного времени для выполнения потока, находящегося в состоянии готовности для выполнения. Создание и запуск потока для каждой задачи означает, что планировщик должен выделять ресурсы каждому такому потоку индивидуально. В сумме потери времени на такое планирование значительно больше, чем потери, которые возникают при наличии постоянно работающего обработчика потока. Иными словами, чем больше потоков, тем выше накладные расходы на их планирование. Если же задание находится в очереди и, соответственно, не выполняется, оно вообще не расходует машинного времени.
  • Когда задачи являются взаимозависимыми и если очередь последовательна, такая ситуация может привести к блокировке системы. Для решения этой проблемы можно использовать несколько подходов:
    • Создается столько обработчиков потоков, сколько задач необходимо выполнять одновременно. В приложении нужно организовать расширяемый пул потоков.
    • В очередь разрешается помещать только те задачи, которые не зависят от других задач. В таких случаях клиент должен не помещать задачу в очередь, а создать экземпляр собственного потока или запустить отдельную очередь с обработчиком потока.
    • Создается интеллектуальная очередь, которая может установить, какие задачи работают совместно, и принять решение, когда ту или иную задачу передать обработчику потока. Этот подход нужно применять только тогда, когда не осталось других возможностей, поскольку такая интеллектуальная очередь должна быть тесно связана с приложением, а сопровождение ее программного кода может стать очень трудоемким занятием.

Просмотров: 18377

Вернуться воглавление


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Полезен материал? Поделись:

Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.