Приоритет потока

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.
  • Гарантирует ли высокий приоритет первый запуск? Нет.
  • Можно ли приоритетом обеспечить синхронизацию? Нет.
  • Что использовать для порядка выполнения? Явную координацию, а не планировщик.