Примеры Java - Получить состояние потока
В жизненном цикле потока Java класс Thread имеет перечислимый тип State, который определяет несколько состояний потока, а именно:
- Новая
- Runnable
- Blocked
- Waiting
- Timed Waiting
- Terminated
Описание каждого состояния:
1. Начальное состояние — NEW
Объявление:
public static final Thread.State NEW
Реализация интерфейса Runnable и наследование от Thread позволяют создать класс потока. Когда экземпляр создаётся с помощью new, поток переходит в начальное состояние.
2. RUNNABLE
Объявление:
public static final Thread.State RUNNABLE
2.1. Состояние готовности
Состояние готовности просто означает, что вы имеете право на выполнение. Если планировщик вас не выберет, вы всегда будете находиться в состоянии готовности.
Вызов метода start() потока переводит поток в состояние готовности.
Когда завершается метод sleep() текущего потока, завершается join() другого потока, заканчивается ожидание ввода пользователя или поток получает блокировку объекта, эти потоки также переходят в состояние готовности.
Когда текущий поток израсходовал свой квант времени или для текущего потока вызывается метод yield(), текущий поток переходит в состояние готовности.
После того как поток в пуле блокировок получает блокировку объекта, он переходит в состояние готовности.
2.2. Состояние выполнения
Состояние, в котором находится поток, когда планировщик потоков выбирает его из пула готовых к выполнению как текущий поток. Это также единственный способ, которым поток переходит в состояние выполнения.
3. Состояние блокировки — BLOCKED
Объявление:
public static final Thread.State BLOCKED
Состояние BLOCKED — это состояние, когда поток блокируется при входе в метод или блок кода, изменённый ключевым словом synchronized (получение блокировки).
4. Ожидание — WAITING
Объявление:
public static final Thread.State WAITING
Потокам в этом состоянии не выделяется процессорное время. Они должны ждать явного пробуждения, иначе будут находиться в состоянии бессрочного ожидания.
5. Ожидание с тайм-аутом — TIMED_WAITING
Объявление:
public static final Thread.State TIMED_WAITING
Потокам в этом состоянии не выделяется процессорное время, но им не нужно ждать бесконечно, чтобы быть явно разбуженными другими потоками; через определённое время они автоматически проснутся.
6. Состояние завершения — TERMINATED
Объявление:
public static final Thread.State TERMINATED
Когда метод run() потока завершается или метод main() главного потока завершается, мы считаем поток завершённым. Объект потока может быть ещё жив, но он больше не является отдельным выполняющимся потоком. После завершения поток нельзя возродить.
Вызов метода start() у завершённого потока выбрасывает java.lang.IllegalThreadStateException.
Следующий пример демонстрирует, как получить состояние потока:
Файл Main.java
Вывод вышеприведённого кода:
State of thread1 after creating it - NEW State of thread1 after calling .start() method on it - RUNNABLE State of thread2 after creating it - NEW State of thread2 after calling .start() method on it - RUNNABLE State of thread2 after calling .sleep() method on it - TIMED_WAITING State of thread1 while it called join() method on thread2 -WAITING State of thread2 when it has finished it's execution - TERMINATEDДругие расширения
Примеры Java