java线程如何转换
Java线程状态转换
Java线程的生命周期包含多种状态,不同状态之间可以通过特定方法或条件进行转换。以下是线程状态及其转换关系的详细说明:
线程的六种状态
-
NEW(新建状态)
线程被创建但尚未调用start()方法。 -
RUNNABLE(可运行状态)
线程调用start()后进入此状态,可能正在运行或等待CPU资源。 -
BLOCKED(阻塞状态)
线程等待获取锁时进入此状态(如synchronized竞争锁失败)。 -
WAITING(无限期等待)
通过Object.wait()、Thread.join()或LockSupport.park()进入,需其他线程显式唤醒。 -
TIMED_WAITING(限期等待)
通过Thread.sleep(long)、Object.wait(long)等方法进入,超时后自动唤醒。 -
TERMINATED(终止状态)
线程执行完毕或异常退出。
状态转换方法及条件
NEW → RUNNABLE
调用线程的start()方法,JVM为其分配资源并调度执行。
RUNNABLE → BLOCKED
线程尝试获取已被其他线程持有的synchronized锁时阻塞。
BLOCKED → RUNNABLE
锁持有者释放锁后,阻塞线程竞争到锁并恢复执行。
RUNNABLE → WAITING
调用以下方法之一:

Object.wait()(需先持有锁)Thread.join()(等待目标线程终止)LockSupport.park()
WAITING → RUNNABLE
其他线程调用Object.notify()/notifyAll()或目标线程终止(针对join())。
RUNNABLE → TIMED_WAITING
调用以下方法之一:
Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis)LockSupport.parkNanos(long timeout)
TIMED_WAITING → RUNNABLE
等待超时或被唤醒(如notify()中断等待)。
RUNNABLE → TERMINATED
线程执行完run()方法或抛出未捕获异常。
代码示例
public class ThreadStateDemo {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread thread = new Thread(() -> {
synchronized (lock) {
try {
lock.wait(); // WAITING状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println(thread.getState()); // NEW
thread.start();
Thread.sleep(100);
System.out.println(thread.getState()); // WAITING
synchronized (lock) {
lock.notify(); // 唤醒线程
}
Thread.sleep(100);
System.out.println(thread.getState()); // TERMINATED
}
}
注意事项
- 线程状态可通过
Thread.getState()获取。 - 从
WAITING或TIMED_WAITING唤醒后需重新竞争锁(如wait()场景)。 - 调用
Thread.interrupt()会中断等待状态,抛出InterruptedException。
通过合理使用锁、等待/通知机制及线程调度方法,可以精确控制线程状态转换以满足并发需求。






