Состояние потока в Java
Поток в JVM не просто «работает или нет». У него есть
состояние из перечисления Thread.State:
новый, runnable, ожидание, блокировка, сон, завершён.
Метод getState() показывает снимок в текущий
момент.
После new Thread(...) объект в состоянии
NEW. После start() поток становится
RUNNABLE (готов или уже выполняется на ядре).
Когда run закончился, состояние
TERMINATED.
Сразу после создания и после завершения:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> { });
System.out.println(t.getState());
t.start();
t.join();
System.out.println(t.getState());
}
}
Первая строка - NEW, вторая после join -
TERMINATED. Между стартом и join состояние
обычно RUNNABLE, но поймать его без паузы
сложно на короткой задаче.
Состояние TIMED_WAITING во время сна:
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread sleeper = new Thread(() -> {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
sleeper.start();
Thread.sleep(50);
System.out.println(sleeper.getState());
sleeper.join();
}
}
Короткая пауза в main даёт worker время уйти в
sleep. Часто увидите TIMED_WAITING.
Состояние WAITING появляется, когда поток
ждёт без таймера, например на join или
wait.
Проверка, жив ли поток, через isAlive():
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> System.out.println("run"));
System.out.println(t.isAlive());
t.start();
System.out.println(t.isAlive());
t.join();
System.out.println(t.isAlive());
}
}
Создайте поток с sleep(300), запустите его,
через 20 мс выведите getState(),
дождитесь join и снова выведите состояние.
Сравните два значения.