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

У реальних завданнях важливість роботи різних потоків може сильно відрізнятися. Для контролю цього процесу було придумано пріоритет роботи. Кожний потік має такий пріоритет – це число від 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 – обов'язково виставити значення до старту потоку?

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

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