Java thread
Для некоторых задач удобно организовать параллельное выполнение нескольких частей программы. Каждая из этих самостоятельных подзадач называется потоком (thread). Существует системный механизм, который обеспечивает совместное использованием процессора. Модель потоков в языке Java является программным механизмом, упрощающим одновременное выполнение нескольких операций в одной и той же программе. Процессор периодически выделяет каждому потоку некоторый отрезок времени. Для каждого потока все выглядит так, словно процессор используется в монопольном режиме, но на самом деле время процессора разделяется между всеми существующими в программе потоками. Ускорение можно получить на многопроцессорном компьютере. При использовании потоков нет нужды учитывать эти тонкости – код не зависит от того, на скольких процессорах будет исполняться. Таким образом, потоки предоставляют механизм масштабирования производительности – если программа работает слишком медленно, можно добиться ускорения, используя многопроцессорную систему, при этом, не переписывая программу заново. При программировании параллельно исполняемых потоков нужно учитывать следующие моменты:
Основные причины использования параллельного выполнения:
Обрабатывающий шаблон Worker Thread (Background Thread, Thread Pool) предназначен для улучшение пропускной способности и минимизация средней задержки при реализации параллельного выполнения. Для того, чтобы реализовать средства поддержки многопоточности корректно, необходимо обладать определенными навыками. Один из способов максимизации эффективности многопоточного приложения состоит в использовании того факта, что не все выполненные в виде потоков задачи приложения имеют одинаковый приоритет. Для некоторых задач на первом месте стоит время выполнения. Другие же просто должны быть выполнены, а когда именно произойдет это выполнение – не столь важно. Разработчик может отделить подобные задачи от приложения и воспользоваться шаблоном Worker Thread. Созданный в соответствии с этим шаблоном обработчик потока будет выбирать из очереди задачи и выполнять их в отдельном потоке. По окончании очередной задачи обработчик выбирает из очереди следующую задачу и все повторяется сначала. Создание многопоточного приложения при использовании шаблона Worker Thread значительно упрощается, поскольку в тех случаях, когда не важно, как скоро будет выполнена задача, разработчику достаточно просто поместить ее в очередь, а все остальное сделает обработчик потока. Программный код такого приложения также упрощается, так как все объекты, работающие с потоками, скрыты внутри обработчика потока и очереди. Шаблон Worker Thread рекомендуется использовать когда:
Для реализации потоков в приложении можно создать новый объект Thread и запустить его на выполнение. Поток, представленный этим объектом, выполнит всю порученную ему работу и автоматически завершится. Однако создание экземпляра потока – это расточительный процесс с точки зрения производительности, он требует немало времени и позволяет выполнить только одну задачу. Более эффективный способ заключается в создании объекта-"долгожителя" – специального обработчика потока, который будет выполнять одну задачу за другой. В выполнении такой работы и состоит сущность шаблона Worker Thread. Обработчик потока, реализованный в соответствии с этим шаблоном, выполняет одну за другой множество не связанных друг с другом задач. Не нужно создавать новый поток при каждом запуске новой задачи – достаточно лишь передать задачу уже существующему обработчику потока, который позаботится об остальном.
Наилучшее решение проблемы временно недоступного обработчика потока состоит в том, чтобы сохранить задачи в очереди до тех пор, пока обработчик потока не освободится. Приложение помещает каждую новую задачу в очередь, а обработчик потока, закончив выполнение очередной задачи, проверяет, есть ли в очереди новые задачи, и если таковые имеются, запускает следующую задачу на выполнение. Это не дает преимущества относительно скорости выполнения задач, но освобождает приложение от необходимости ожидания, пока освободится обработчик потока. Если нет задач для выполнения, обработчик периодически проверяет очередь. Помещение задачи в очередь – гораздо менее требовательный с точки зрения производительности процесс, чем создание нового потока.
|