Главная » Java » Упорядочение потоков во времени Java

0

 

Потоки программного приложения решают собственные задачи, различные по степени значимости. В качестве количественного показателя важности Выполняемых функций потоку ставится в соответствие приоритет (priority), значение которого используется системой для определения того, какой из потоков должен выполняться в каждый момент времени. Jаvа-программы – одно- или многопоточные – способны работать как на однопроцессорных, так и на многопроцессорных системах, поэтому о решении задачи управления потоками во времени можно говорить только В самых общих терминах. В системе с N процессорами ‘одновременно может выполняться N высокоприоритетных потоков. Потокам, Обладающим более низкими значениями приоритета, ресурсы процессоров обычно отдаются только в том случае, когда более важные потоки блокированы. Чтобы предотвратить вероятность зависания, система вправе предоставлять ресурсы низкоприоритетным потокам и в другие моменты времени – в связи с так называемым старением приоритетов (priority aging), – но прикладные программы {е в состоянии серьезно использовать такую возможность.

Работа потока продолжается до тех пор, пока не будет заблокирована вследствие выполнения wait, sleep или некоторых операций ввода-вывода) либо временно прервана – из-за того, что приступил К работе поток с более высоким приоритетом либо планировщик заданий принял решение о передаче ресурсов другому потоку (например, ввиду истечения времеии (time slice), ) отпущенного на непрерывную работу потока).

Определение расписания приоритетного обслуживания потоков с прерываниями (preemption) входит в компетенцию конкретной виртуальной машины fava. Зачастую твердых гарантий поведения системы в отношении планирования заданий не существует – можно только ожидать, что предпочтение в том или IHOM случае будет отдано потоку, обладающему более высоким приоритетом. атрибуты приоритетов следует при менять только в целях воздействия на системную политику упорядочения потоков для повышения общей производительности программы. Базовый алгоритм приложения никоим образом не должен зависеть от схемы расстановки приоритетов потоков. Намереваясь создать правильный многопоточный код, не зависящий от платформы, мы обязаны принять во внимание, что выполнение каждого потока может быть приостановлено в лю50Й момент. Поэтому следует всегда заботиться о надежной защите ресурсов, находящихся в совместном пользовании. Если же ввиду объективной необходимости следует учитывать возможность приоритетного прерывания работы потоков в определенные моменты времени, нам придется явно применять схемы взаимодействия потоков, использующие методы ожидания и оповещения. Кроме того не в состоянии выдвигать какие бы то ни было предположения о порядке, в котором права на блокировку объекта раздаются потокам, а также о последовательности получения потоками уведомлений, посланных методами оповещения, – все это является прерогативой исполняющей системы.

исходное значение приоритета потока соответствует приоритету потока. Величина приоритета может быть изменена посредством вызова метода setPriогity с аргументом из интервала, который задается значениями именованных констант MIN_PRIORIТY и MAX-PRIORIТY, определенных в составе класса Thread. Приоритету потока, предлагаемому по умолчанию, соответствует константа NORM_PRIORIТY. Приоритет работающего потока допускается изменять в любой момент. Если приоритет потока понижается, система может передать вычислительные ресурсы другому потоку, поскольку исходный утратит "членство" в группе потоков с наивысшими приоритетами. Чтобы получить текущее значение приоритета потока, следует воспользоваться методом getpriогity.

Вообще говоря, непрерывно выполняющаяся часть приложения должна обладать более низким приоритетом в сравнении с теми потоками, которые обслуживают события, происходящие реже (скажем, связанные с интерфейсом пользователя). Если, например, пользователь щелкает мышью на кнопке Отмена, он предполагает, что приложение должно прекратить текущую работу. Если функции обновления экрана и обработки вводимых пользователем данных обладают одинаковым приоритетом, между событием пользовательского интерфейса и ответной реакцией системы может пройти немало времени. Если присвоить потоку, обновляющему содержимое экрана, более низкий приоритет, он все еще будет выполняться весьма активно, поскольку поток, отвечающий за интерфейс пользователя, блокируется в ожидании действий пользователя. Как только происходит событие, связанное с интерфейсом пользователя, соответствующий поток прерывает работу потока обновления экрана, чтобы обработать введенные пользователем данные. Для потока, занимающегося обновлением экрана, обычно задается приоритет, равный NORM_PRIORITY+l, что позволяет избежать "захвата" потоком всех квантов процессорного времени, а потоку пользовательского интерфейса часто присваивается приоритет NORM_PRIORITY+l.

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

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии