Приоритеты потоков

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

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

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

Внимание! Из-за разницы в способах переключения операционными системами потоковых контекстов могут возникать проблемы переносимости.