Состояния потока
Thread.State содержит ровно шесть состояний:
| Состояние | Что означает | Типичный переход |
|---|---|---|
NEW | объект создан, start() еще не вызван | new Thread(...) |
RUNNABLE | поток готов выполняться или выполняется | после start() |
BLOCKED | ждет входа в synchronized на занятом мониторе | попытка захватить монитор |
WAITING | ждет без тайм-аута действия другого потока | wait(), join(), park() |
TIMED_WAITING | ждет не дольше заданного времени | sleep, timed wait/join/park |
TERMINATED | run() закончен нормально или исключением | финальное состояние |
В перечислении нет отдельных состояний RUNNING, READY и DEAD. JVM объединяет ready и running в RUNNABLE; бытовое «dead» соответствует TERMINATED.
stateDiagram-v2 [*] --> NEW NEW --> RUNNABLE: start() RUNNABLE --> BLOCKED: занят monitor BLOCKED --> RUNNABLE: monitor получен RUNNABLE --> WAITING: wait / join / park WAITING --> RUNNABLE: сигнал / завершение / unpark RUNNABLE --> TIMED_WAITING: sleep / ожидание с timeout TIMED_WAITING --> RUNNABLE: timeout / сигнал RUNNABLE --> TERMINATED: run завершен
Важно:
yield()не переводит поток вTIMED_WAITING: это лишь подсказка планировщику, поток остаетсяRUNNABLE.interrupt()сам по себе не означаетTERMINATED.getState()— мгновенный диагностический снимок. Сразу после чтения состояние уже может измениться.- Поток в
BLOCKEDждет именно intrinsic monitor. ОжиданиеLock, сокета или очереди может отображаться какWAITING/TIMED_WAITING.
На собеседовании
- Чем
BLOCKEDотличается отWAITING? Первый ждет входа в занятыйsynchronized; второй ждет явного события без тайм-аута. - Где состояние
RUNNING? Оно входит вRUNNABLE. - Можно ли повторно запустить
TERMINATED? Нет, нужен новый объектThread. - Почему
getState()нельзя использовать для координации? Это гоняющийся снимок, а не гарантия. - Куда переводит
sleep()? ВTIMED_WAITING.