1.线程状态类型
Java线程状态是一个枚举类型,即 Thread.State。如下图,打印输出所有的线程状态类型:
java
public class ThreadState {
public static void main(String[] args) {
for (Thread .State state :Thread.State.values()) {
System.out.println(state);
}
}
}
输出结果:

输出结果中共有6种,它们的含义分别是:
- NEW:刚创建好线程,还未开始执行。
- RUNNABLE:可执行的,可分为正在执行中和准备执行。
- WAITING、TIMED_WAITING、BLOCKED:这三种线程状态都表示线程正在等待执行其他任务。
- TERMINATED:线程执行完毕。
2.线程状态的意义和状态转移
2.1 意义
①控制CPU资源分配:避免抢占混乱,提高整体效率。
②休眠、等待和唤醒的可视化:更直观得实现多线程协调合作。
③监控线程的生命周期:避免死锁、卡死状态影响线程执行任务。
2.2状态转移图

3.观察线程的状态和转移
①关注 NEW 、RUNNABLE 和 TERMINATED 状态转换。
java
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread (() -> {
for (int i = 0; i < 1000_0000; i++) {
}
}, "李四");
//刚创建好线程
System.out.println(t.getName() + ": " + t.getState());;
t.start();
while (t.isAlive()) {
//线程执行中
System.out.println(t.getName() + ": " + t.getState());;
}
//线程执行结束
System.out.println(t.getName() + ": " + t.getState());;
}
输出结果:

②关注 WAITING、TIMED_WAITING 和 BLOCKED状态的转换
java
public class TestThread {
public static void main(String[] args) {
final Object object = new Object();
// 线程 t1:拿到锁后死循环 + 每秒sleep,永远不释放锁
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}, "t1");
t1.start();
// 线程 t2:永远拿不到锁,所以永远不会输出 hehe
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (object) {
System.out.println("hehe");
}
}
}, "t2");
t2.start();
}
}
使用jconsole 可以看到t1 的状态是TIMED_WAITING ,t2 的状态是BLOCKED。
修改上面的代码,把t1 中的sleep 换成wait,使用jconsole 可以看到t1 的状态是WAITING。
以上就是关于Java线程状态的相关介绍和总结,如有表述不当的地方,欢迎大家指点,感兴趣的小伙伴不妨点个关注再走吧~