Планировщик потоков использует приоритеты потоков исполнения, чтобы принять решение, когда разрешить исполнение каждому потоку. Теоретически высокоприоритетные потоки исполнения получают больше времени ЦП, чем низкоприоритетные.
А на практике количество времени ЦП, которое получает потоки сполнения, нередко зависит не только от его приоритета, но и от ряда других факторов. ( Например, особенности реализации многозадачности в операционной системе могут оказывать влияние на относительную доступность времени ЦП. ).
Высокоприоритетный поток исполнения может также вытеснять низкоприоритетный. Например, когда низкоприоритетный поток исполняется, а высокоприоритетный собирается возобновить свое исполнение, прерванное в связи с приостановкой или ожиданием завершения операции ввода-вывода, то он вытесняет низкоприоритетный поток.
Теоретически потоки исполнения с одинаковым приоритетом должны получать равный доступ к ЦП. Но не следует забывать, что язык Jаvа предназначен для применения в обширном ряде сред.
В одних из этих сред многозадачность реализуется совершенно иначе, чем в других. В целях безопасности потоки исполнения с одинаковым приоритетом должны получать управление лишь время от времени. Этим гарантируется, что все потоки получат возможность выполняться в среде операционной системы с невытесняющей многозадачностью.
Но на практике даже в средах с невытесняющей многозадачностью большинство потоков все-таки имеют шанс для исполнения, поскольку во всех потоках неизбежно возникают ситуации блокировки, например, в связи с ожиданием ввода-вывода.
Когда случается нечто подобное, исполнение заблокированного потока приостанавливается, а остальные потоки могут исполняться. Но если требуется добиться плавной работы многопоточной программы, то полагаться на случай лучше не стоит.
К тому же в некоторых видах задач весьма интенсивно используется ЦП. Потоки, исполняющие такие задачи, стремятся захватить ЦП, поэтому передавать им управление следует изредка, чтобы дать возможность выполняться другим потокам.
Чтобы установить приоритет потока исполнения, следует вызвать метод setPriority() из класса Thread. Его общая форма выглядит следующим образом:
1 |
final void setPriority(int уровень) |
где аргумент уровень обозначает новый уровень приоритета для вызывающего потока исполнения.
Значение аргумента уровень должно быть в пределах от MIN_PRIORITY до МAX_PRIORITY.
Программирование на многопоточном уровне не так уж и сложное дело если делать все это под хорошей музыкой. Далее по ссылке вы сможете найти хорошие наушники Monster Beats по доступным ценам. У самого такие имеются уже год, программировать с ними одно удовольствие.
В настоящее время эти значения равны соответственно 1 и 10. Чтобы возвратить потоку исполнения приоритет по умолчанию, следует указать значение NORМ_PRIORIТУ, которое в настоящее время равно 5.
Эти приоритеты определены в классе Thread как статические завершенные ( statiс final ) переменные. Для того чтобы получить текущее значение приоритета потока исполнения, достаточно вызвать метод getPriority() из класса Thread, как показано ниже.
1 |
final int getPriority() |
Разные реализации Jаvа моrуг вести себя совершенно иначе в отношении планирования потоков исполнения. Большинство несоответствий возникает при наличии потоков исполнения, опирающихся на вытесняющую многозадачность вместо совместного использования времени ЦП.
Наиболее безопасный способ получить предсказуемое межплатформенное поведение многопоточных программна Java состоит в том , чтобы использовать потоки исполнения, которые добровольно уступают управление ЦП.