JavaRush /Курси /Модуль 2. Java Core /Пріоритети потоків

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

Модуль 2. Java Core
Рівень 13 , Лекція 1
Відкрита

— Продовжимо наш урок. Що таке пріоритети потоків і навіщо вони потрібні?

У реальних завданнях важливість роботи різних потоків може сильно відрізнятися. Для контролю цього процесу було придумано пріоритет роботи. Кожний потік має такий пріоритет – це число від 1 до 10.

10 – це найвищий пріоритет.

1 – найнижчий.

Якщо пріоритет не заданий, потік отримує пріоритет 5 — середній.

Пріоритет потоку не сильно впливає на його роботу, а має радше рекомендаційний характер. Якщо є кілька сплячих потоків, які потрібно запустити, Java-машина спочатку запустить потік з вищим пріоритетом.

Java-машина керує потоками так, як вважатиме за потрібне. Потоки з низьким пріоритетом не простоюватимуть. Просто вони отримуватимуть менше часу, ніж інші, але виконуватимуться все одно будуть.

Зазвичай потоки завжди виконуються з однаковим пріоритетом. Спроба дати одному потокові більше часу, ніж іншим часто вказує на архітектурну помилку програми.

— Оце так. А я вже розмріявся, що зараз призначу потокові найвищий пріоритет, і він робитиме у 10 разів більше.

— А тут виявляється ситуація, близька до finalize: потік з високим пріоритетом може і працюватиме більше, а може й ні – ніхто не дає жодної гарантії.

— До речі, а як змінити пріоритет потоку?

— Це дуже просто. У класу Thread є два методи:

Метод Опис
void setPriority(int newPriority)
Встановлює нове значення пріоритету
int getPriority()
Повертає поточний пріоритет потоку

У класу Thread так само є три константи:

public final static int MIN_PRIORITY = 1;

public final static int NORM_PRIORITY = 5;

public final static int MAX_PRIORITY = 10;

— Дай-но, вгадаю. MIN_PRIORITY — це мінімальний пріоритет, MAX_PRIORITY — максимальний, а NORM_PRIORITY — пріоритет за замовчуванням?

— Так, саме так. Зможеш сам написати код, який встановлює потокові найвищий пріоритет.

— А тут є якийсь підступ? Начебто так:

Thread thread = new MyThread();
thread.setPriority(Thread. MAX_PRIORITY)
thread.start();

— Все правильно. Нічого складного, так?

— Ага. А чи можна встановлювати/змінювати пріоритет потоку після його запуску? Чи тут як з setDaemon – обов'язково виставити значення до старту потоку?

— Пріоритет можна змінювати і після старту. Як я вже говорив, кардинальних змін це не спричиняє.

— Невелика, але цікава тема. Дякую.

Коментарі (4)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Nataliia Fedyshyn Рівень 111
4 травня 2025
Хтось може підказати коли ми читали про setDaemon?
Олександр Рівень 68
14 березня 2025
В першій задачі в правильному розв'язку оголошення змінної прописано так:

private static volatile AtomicInteger priority = new AtomicInteger(1);
Питання: Там дійсно потрібнописати volatile? І якщо так, то поясніть чому. Бо в мене і без цього працює.
Роман Рівень 94 Expert
27 вересня 2023
Явно переплутали складність завдань, нажаль всі задачі не відповідають рівню, мало інформації в лекції, все дуже складно для розуміння
Михайло Рівень 1 Expert
15 липня 2023
Задача Magic class справжній HARD