NOTE

6.40 Java Thread States

The six Thread.State values, what each means, and why Java thread state is not identical to an operating-system scheduler state.

JavaCreated Updated 1 min readhistorical

This is a historical learning note and may contain outdated or incomplete understanding.

1. Thread.State

Java exposes six high-level thread states:

  • NEW: created but not started;
  • RUNNABLE: executing in the JVM or eligible to run;
  • BLOCKED: waiting to acquire a Java monitor for a synchronized region;
  • WAITING: waiting indefinitely for another action;
  • TIMED_WAITING: waiting with a deadline/timeout;
  • TERMINATED: execution has completed.

2. Important Distinctions

RUNNABLE does not mean “currently executing on a CPU”. It combines states that the operating system may distinguish, such as actively running and runnable-but-not-scheduled.

BLOCKED has a narrow Java meaning: waiting for monitor entry. A thread waiting in LockSupport.park(), Object.wait(), or Thread.join() is represented as WAITING/TIMED_WAITING, not BLOCKED merely because it is not progressing.

3. Typical Transitions

  • NEW -> RUNNABLE: start();
  • RUNNABLE -> BLOCKED: monitor acquisition contention;
  • RUNNABLE -> WAITING: wait(), untimed join(), park();
  • RUNNABLE -> TIMED_WAITING: sleep(), timed wait/join, timed park;
  • waiting states -> RUNNABLE: notification, timeout, unpark, interrupt, or lock availability as appropriate;
  • RUNNABLE -> TERMINATED: run() finishes or exits with an uncaught exception.

These are JVM-level diagnostic states. When debugging scheduling or native blocking, correlate them with OS/native-thread information rather than treating them as a complete scheduler model.

Loading helpful count