Ответ
В Java поток может находиться в одном из 6 состояний, определенных в перечислении Thread.State:
1. NEW
- Поток создан, но метод
start()ещё не вызван.Thread thread = new Thread(() -> System.out.println("Running")); System.out.println(thread.getState()); // NEW
2. RUNNABLE
- Поток готов к выполнению и ожидает выделения процессорного времени.
- Включает состояния "ready" и "running" в терминах ОС.
thread.start(); // Состояние RUNNABLE, даже если поток ещё не получил CPU
3. BLOCKED
- Поток заблокирован в ожидании монитора для входа в synchronized-блок или метода.
synchronized (lock) { // Другой поток, пытающийся войти сюда, будет BLOCKED }
4. WAITING
- Поток ждет неопределенно долго другого потока.
- Вызывается:
object.wait(),thread.join()без таймаута.synchronized (lock) { lock.wait(); // Переход в WAITING }
5. TIMED_WAITING
- Поток ждет с ограничением по времени.
- Вызывается:
Thread.sleep(millis),object.wait(timeout),thread.join(timeout).Thread.sleep(1000); // TIMED_WAITING на 1 секунду
6. TERMINATED
- Поток завершил выполнение.
Переходы между состояниями:
NEW → start() → RUNNABLE
RUNNABLE → synchronized → BLOCKED
RUNNABLE → wait() → WAITING
RUNNABLE → sleep() → TIMED_WAITING
Любое состояние → завершение → TERMINATED
Важно: Состояние BLOCKED отличается от WAITING/TIMED_WAITING:
BLOCKED— ожидание монитора (synchronized)WAITING/TIMED_WAITING— ожидание уведомления или таймаута