【总结】Java的线程状态

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线程状态的相关介绍和总结,如有表述不当的地方,欢迎大家指点,感兴趣的小伙伴不妨点个关注再走吧~

相关推荐
张彦峰ZYF5 分钟前
功能齐了不等于能上线:智能工单系统的AI回归测试、安全防护、成本可观测与CI/CD生产部署
后端·企业智能工单系统·评测线·安全线·成本线·部署线
这个昵称不容易8 分钟前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设
Rain的Java大神之路8 分钟前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
量化分析码农21 分钟前
【Python量化波动率实战 05】你的组合真的分散了吗:滚动相关与分散化收益
后端
IT_陈寒1 小时前
Vue这个奇葩的响应式问题让我加班到凌晨
前端·人工智能·后端
天天被压力1 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
天天被压力1 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
脚本自动化开发8 小时前
存储涨价后,磐镭WO5迷你主机值得买吗
后端
爱敲代码的小黄9 小时前
神经网络入门指南:从 CNN、RNN 到 Attention
人工智能·面试·程序员
Wang's Blog10 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友