Приоритет потока
Java хранит приоритет от Thread.MIN_PRIORITY (1) до Thread.MAX_PRIORITY (10); Thread.NORM_PRIORITY равен 5. Новый platform thread наследует приоритет создавшего его потока. У virtual thread приоритет всегда NORM_PRIORITY, а попытка изменить его игнорируется.
Thread worker = new Thread(task);
worker.setPriority(Thread.NORM_PRIORITY);
worker.start();Приоритет — лишь подсказка планировщику. Отображение Java-приоритета на приоритет ОС зависит от JVM и платформы; оно не гарантирует порядок, долю CPU или отсутствие starvation.
Поэтому логика программы не должна зависеть от приоритета:
// Плохо: надеяться, что high завершится раньше low.
high.setPriority(Thread.MAX_PRIORITY);
high.start();
low.start();Если нужен порядок, используют join, очередь, latch, lock или последовательный executor. Если нужно разделить типы нагрузки, создают разные ограниченные пулы и измеряют их очереди.
На собеседовании
- Какой приоритет по умолчанию? Обычно унаследованный; у main обычно
NORM_PRIORITY = 5. - Гарантирует ли высокий приоритет первый запуск? Нет.
- Можно ли приоритетом обеспечить синхронизацию? Нет.
- Что использовать для порядка выполнения? Явную координацию, а не планировщик.