Что значит приоритет потока?
Приоритет потока – это целочисленное значение, которое служит рекомендацией планировщику потоков операционной системы при распределении процессорного времени. Потоки с более высоким приоритетом теоретически получают больше времени CPU, но это не гарантировано – реальное поведение зависит от ОС и текущей нагрузки.
Константы приоритетов
| Константа | Значение | Назначение |
|---|---|---|
Thread.MIN_PRIORITY |
1 | Минимальный приоритет |
Thread.NORM_PRIORITY |
5 | Приоритет по умолчанию |
Thread.MAX_PRIORITY |
10 | Максимальный приоритет |
Методы для работы с приоритетом
Пример
// Установить приоритет (1..10)
thread.setPriority(Thread.MAX_PRIORITY);
// Получить текущий приоритет
int priority = thread.getPriority();
Важные нюансы
- Наследование приоритета. Новый поток наследует приоритет потока-родителя (того потока, из которого он создан).
- Зависимость от ОС. Разные операционные системы по-разному отображают 10 уровней Java на свои уровни приоритетов. Например, Windows имеет 7 уровней, а Linux-планировщик CFS по умолчанию практически игнорирует приоритеты Java-потоков (Java-приоритеты отображаются на
nice-значения, но диапазон ограничен). - Не средство синхронизации. Приоритет – это рекомендация, а не гарантия. Нельзя строить логику программы на предположении, что высокоприоритетный поток всегда выполняется раньше низкоприоритетного.
- Starvation. Злоупотребление приоритетами может привести к «голоданию» (starvation) низкоприоритетных потоков, которые не получают процессорное время.
- Вызов до
start(). Приоритет лучше установить до вызоваstart(), хотя можно менять и во время выполнения.
Аналогия из жизни. Приоритет потока – это как VIP-статус в очереди в поликлинику: VIP-пациенты обычно проходят быстрее, но если врач занят – даже VIP будет ждать. А в некоторых клиниках VIP-очередь вообще не предусмотрена, и все стоят одинаково.
На собеседовании. Главное, что хотят услышать: приоритеты потоков – это рекомендация, а не гарантия. На практике они редко используются в прикладном коде. Упомяните, что на разных ОС поведение различается, и что полагаться на приоритеты для корректности программы – ошибка. Также можно упомянуть, что у Virtual Threads (Java 21+) приоритет фиксирован и равен
NORM_PRIORITY, его нельзя изменить.