当前位置: 首页 > news >正文

线程的状态

线程总共由以下6种状态:

1.NEW  Thread对象创建好了,但是还没有调用start方法在系统中创建线程!

2.TERMINATED  对象仍然存在,但是系统内部的线程已经执行完毕

3.RUNNABLE  就绪状态。表示线程或者在cpu上执行,或者准备就绪可以去cpu上执行!

4.TIMED_WAITING  指定时间的阻塞。就在到达一定的时间就会自动解除阻塞。使用sleep会进入这个状态。使用带有时间的join()也会进入这个状态!

5.WAITING  不带时间的阻塞(死等)必须要满足一定的条件,才会解除阻塞join或者wait都会进入WAITING。

6.BLOCKED  由于锁竞争,引起的阻塞!

通过图来表示👇

用下面的代码表示6个阶段👇

public class ThreadDemo25 {
    private static final Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        // 创建线程对象,此时线程处于 NEW 状态

        Thread thread = new Thread(() -> {
            // 模拟线程执行一些任务,进入 RUNNABLE 状态
            System.out.println("线程开始执行,当前状态: " + Thread.currentThread().getState());

            // 模拟线程等待一段时间,进入 TIMED_WAITING 状态
            try {
                System.out.println("线程即将进入 TIMED_WAITING 状态");
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 线程获取锁,模拟 BLOCKED 状态
            synchronized (lock) {
                try {
                    // 模拟线程等待,进入 WAITING 状态
                    System.out.println("线程即将进入 WAITING 状态");
                    lock.wait(); //这个会释放对象的锁,并进入该对象的等待池,等待被唤醒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程继续执行");
        });


        // 输出线程的初始状态:NEW
        System.out.println("线程初始状态: " + thread.getState());

        // 启动线程,使其进入 RUNNABLE 状态
        thread.start();
        // 短暂休眠,确保线程有机会进入 RUNNABLE 状态
        Thread.sleep(100);
        System.out.println("线程启动后状态: " + thread.getState());

        // 主线程休眠,等待子线程进入 TIMED_WAITING 状态
        Thread.sleep(500);
        System.out.println("线程 TIMED_WAITING 状态: " + thread.getState());

        Thread.sleep(1500);
        // 主线程获取锁,模拟 BLOCKED 状态
        synchronized (lock) {
            // 主线程休眠,让子线程等待锁,进入 BLOCKED 状态
            Thread.sleep(1000);
            System.out.println("线程 WAITING 状态: " + thread.getState());
            // 唤醒等待的线程,使其从 WAITING 状态恢复,此时这个对象还是有锁的。
            //所以就发生了锁竞争!
            lock.notify();
            System.out.println("线程BLOCKED状态:"+thread.getState());
        }

        // 等待线程执行完毕,进入 TERMINATED 状态
        thread.join();

        System.out.println("线程最终状态: " + thread.getState());
    }
}

相关文章:

  • 结构化需求分析SA
  • JavaWeb开发入门:从前端到后端的完整流程解析
  • vue3按钮级别权限处理,自定义指令
  • redis主从哨兵模式+Lua报错-READONLY You can‘t write against a read
  • Java之异常体系
  • Java Set实现类面试题
  • IP----访问服务器流程
  • 解密 Token:大模型如何解析中英文文本
  • 基于 Python 和 Django 的文本情感分析系统设计与实现
  • 音视频容器格式
  • 智能证件照处理器(深度学习)
  • IRI 2016 模型在线版 MATLAB
  • JMeter
  • Java IO 流:从入门到实践
  • 基于javaweb的SpringBoot社区维修平台设计和实现(源码+文档+部署讲解)
  • 如何用Python开发一款可以标注课标单词的工具
  • 【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】
  • 全面汇总windows进程通信(二)
  • 【DeepSeek与鸿蒙HarmonyOS:开启应用开发新次元】
  • 机械行业金属材料重量计算器
  • 网站访问量统计工具/免费广告推广
  • 提供秦皇岛网站建设哪里有/怎么样进行网络推广
  • 网站建设排名/网站制作详细流程
  • 网站群如何做网站/今天刚刚发生的新闻
  • 济南网站建设伍际网络/百度怎么发帖做推广
  • 网站底部素材/关键词检索