— Продовжимо наш урок. Що таке пріоритети потоків і навіщо вони потрібні?
У реальних завданнях важливість роботи різних потоків може сильно відрізнятися. Для контролю цього процесу було придумано пріоритет роботи. Кожний потік має такий пріоритет – це число від 1 до 10.
10 – це найвищий пріоритет.
1 – найнижчий.
Якщо пріоритет не заданий, потік отримує пріоритет 5 — середній.
Пріоритет потоку не сильно впливає на його роботу, а має радше рекомендаційний характер. Якщо є кілька сплячих потоків, які потрібно запустити, Java-машина спочатку запустить потік з вищим пріоритетом.
Java-машина керує потоками так, як вважатиме за потрібне. Потоки з низьким пріоритетом не простоюватимуть. Просто вони отримуватимуть менше часу, ніж інші, але виконуватимуться все одно будуть.
Зазвичай потоки завжди виконуються з однаковим пріоритетом. Спроба дати одному потокові більше часу, ніж іншим часто вказує на архітектурну помилку програми.
— Оце так. А я вже розмріявся, що зараз призначу потокові найвищий пріоритет, і він робитиме у 10 разів більше.
— А тут виявляється ситуація, близька до finalize: потік з високим пріоритетом може і працюватиме більше, а може й ні – ніхто не дає жодної гарантії.
— До речі, а як змінити пріоритет потоку?
— Це дуже просто. У класу Thread є два методи:
Метод | Опис |
---|---|
|
Встановлює нове значення пріоритету |
|
Повертає поточний пріоритет потоку |
У класу 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 – обов'язково виставити значення до старту потоку?
— Пріоритет можна змінювати і після старту. Як я вже говорив, кардинальних змін це не спричиняє.
— Невелика, але цікава тема. Дякую.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ