Статья

Состояния потоков в Java

Выше изображена модель состояний для потока Java. Она показывает, между какими состояниями переходит поток Java на протяжении своего жизненного цикла.
В Java есть перечисление Thread.State, элементы которого соответствуют состояниям из этой модели. Оно становится прослойкой над представлением состояний потока с точки зрения операционной системы.

Объект потока Java изначально создается в состоянии NEW. На этот момент поток ОС еще не существует (и возможно, никогда не будет существовать). Чтобы создать поток как ветвь выполнения, необходимо вызвать Thread start() — тем самым вы заставляете ОС создать настоящий поток.
Планировщик помещает новый поток в очередь выполнения и в какой-то будущий момент находит ядро, на котором поток будет выполняться (причем если машина сильно загружена, может потребоваться какое-то время ожидания). С того момента, как потоку будет выделено время, он станет выполняться, пока не израсходует это время, а затем переместится обратно в очередь выполнения, ожидая следующего временного интервала от процессора. Так работает принудительное планирование потоков.
В процессе планирования — когда поток назначается ядру, выполняется и возвращается в очередь выполнения — объект Java Thread находится в работоспособном состоянии (RUNNABLE).
Остальные состояния означают, что в настоящий момент поток не может использовать ядро. На уровне потока перейти в такой режим можно двумя способами:
1) Программный код вызывает Thread.sleep(), указывая тем самым, что поток должен выждать фиксированное время, прежде чем продолжить работу
2) Поток понимает, что он должен дождаться, пока выполнится некоторое внешнее условие, и вызывает Object.wait()
В обоих случаях ОС немедленно снимает поток с ядра. Тем не менее дальнейшие события развиваются по разному.
В первом случае поток запрашивает приостановку на определенный промежуток времени. Поток Java переходит в состояние TIMED_WAITING, а операционная система запускает таймер. По истечении срока приостановленный поток активизируется: он снова готов к выполнению и возвращается в очередь выполнения.
Во втором случае задействуется условный аспект мониторов Java, которые действуют на уровне объекта. Поток переходит в состояние WAITING и ожидает неопределенно долго. Обычно он не активизируется, пока операционная система не сигнализирует, что условие было выполнено, — как правило, для этого из другого потока вызывается Object.notify() для текущего объекта.
Кроме этих двух состояний, которые контролируются на уровне потоков, поток может перейти в заблокированное состояние BLOCKED, потому что он ожидает ввода/вывода или получения блокировки, которую удерживает другой поток. Наконец, если поток ОС, соответствующий объекту Java Thread, прекратил выполнение, то этот объект перейдет в состояние TERMINATED.
2024-06-27 21:10 java