
— Продолжим наш урок. Что же такое приоритеты нитей и зачем они нужны.
В реальных задачах важность работы разных нитей может сильно различаться. Для контроля этого процесса был придуман приоритет работы. У каждой нити есть такой приоритет – это число от 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 – обязательно выставить значение до старта нити?
— Приоритет можно менять и после старта. Как я уже говорила, кардинальных изменений это не влечет.
— Небольшая, но интересная тема. Спасибо, Элли.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ