Какие состояния потока (Thread State) существуют в Java?

«Какие состояния потока (Thread State) существуют в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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 — ожидание уведомления или таймаута