本文将用生动代码示例带你穿透Java线程的六大状态,彻底掌握状态转换的本质逻辑。
1. 线程状态全景图
Java线程在生命周期中会经历不同的状态,这些状态在Thread.State枚举中明确定义:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
2. 六大状态深度解析
2.1 新建状态(NEW)
当线程对象被创建但尚未启动时:
Thread thread = new Thread(() -> {
// 线程任务
});
System.out.println(thread.getState()); // 输出: NEW
2.2 可运行状态(RUNNABLE)
一旦调用start()方法,线程进入RUNNABLE状态,注意此状态包含就绪和运行中两种子状态:
thread.start();
System.out.println(thread.getState()); // 输出: RUNNABLE
2.3 阻塞状态(BLOCKED)
线程等待监视器锁时的状态:
public class BlockedStateExample {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread t1 = new Thread(() -> {
synchronized (lock) {
try { Thread.sleep(1000); }
catch (InterruptedException e) {}
}
});
Thread t2 = new Thread(() -> {
synchronized (lock) {
// 获取锁
}
});
t1.start();
Thread.sleep(100); // 确保t1先获取锁
t2.start();
Thread.sleep(100); // 确保t2已启动
System.out.println(t2.getState()); // 输出: BLOCKED
}
}
2.4 等待状态(WAITING)
线程无限期等待其他线程执行特定操作:
public class WaitingStateExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
try {
Thread.currentThread().join(); // 自己等待自己,将永远等待
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
Thread.sleep(500);
System.out.println(thread.getState()); // 输出: WAITING
}
}
2.5 定时等待状态(TIMED_WAITING)
线程等待指定的时间:
public class TimedWaitingStateExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
Thread.sleep(500);
System.out.println(thread.getState()); // 输出: TIMED_WAITING
}
}
2.6 终止状态(TERMINATED)
线程执行完毕后的状态:
public class TerminatedStateExample {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
// 简单任务
});
thread.start();
Thread.sleep(1000); // 等待线程执行结束
System.out.println(thread.getState()); // 输出: TERMINATED
}
}
3. 状态转换实战演示
以下示例展示完整的状态流转过程:
public class ThreadLifecycleDemo {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread thread = new Thread(() -> {
// 状态转换:NEW -> RUNNABLE
synchronized (lock) {
try {
Thread.sleep(1000); // TIMED_WAITING
lock.wait(); // WAITING
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println("创建后: " + thread.getState()); // NEW
thread.start();
System.out.println("启动后: " + thread.getState()); // RUNNABLE
Thread.sleep(100);
synchronized (lock) {
System.out.println("获取锁后: " + thread.getState()); // BLOCKED
lock.notify();
}
Thread.sleep(100);
System.out.println("等待后: " + thread.getState()); // TIMED_WAITING
Thread.sleep(2000);
System.out.println("最终状态: " + thread.getState()); // TERMINATED
}
}
4. 状态监测与实战技巧
状态监测要点:
- getState()方法返回线程当前状态
- 状态转换由JVM控制,非人为直接干预
- 阻塞和等待状态是性能优化的关键关注点
实战建议:
- 使用jstack或可视化工具监控线程状态
- 避免过度线程阻塞,减少WAITING/BLOCKED状态时间
- 合理设置超时时间,避免永久等待
- 使用线程池管理线程生命周期
5. 总结
掌握Java线程状态转换机制是多线程编程的基石。通过本文的代码示例,我们能够清晰理解:
- 每种状态的具体触发条件
- 状态之间的转换关系
- 如何诊断和解决线程阻塞问题
精准掌控线程状态,才能编写出高效、稳定的并发应用程序,真正发挥多核处理器的强大威力。

被折叠的 条评论
为什么被折叠?



