线程在操作系统以及java中的几种状态(源码分析)

操作系统中一般将线程划分为五种状态:新建、可运行(就绪)、运行、阻塞、终止

  1. 新建(New):当一个线程被创建时,它处于新建状态。此时,线程对象已经创建,但还没有分配到CPU资源。

  2. 就绪(Ready):当一个线程需要执行某个任务时,它会被放入就绪队列中。就绪队列中的线程等待CPU的调度,以获取执行权限。当有其他线程释放了CPU资源,并且该线程满足执行条件时,它将从就绪队列中取出并进入可运行状态。

  3. 运行(Running):当一个线程被分配到CPU资源后,它就会进入运行状态。此时,线程正在执行其任务,并占用CPU资源。

  4. 阻塞(Blocked):当一个线程在执行过程中遇到某种情况,如等待输入、等待I/O操作完成等,它可能会暂时停止执行,进入阻塞状态。阻塞状态下的线程不会消耗CPU资源,而是等待相应的事件发生后再恢复执行。

  5. 终止(Terminated):当一个线程完成任务或出现异常时,它会被标记为终止状态。此时,线程不再占用任何系统资源,可以安全地结束其生命周期。

线程状态在java中定义,通过查看Thred源码 我们会发现java将线程定义了六种状态,如下图所示:

  1. NEW:新建状态,表示线程刚被创建,但还没有调用start()方法。此时,线程对象已经创建,但还没有分配到CPU资源。

  2. RUNNABLE:可运行状态,表示线程已经调用了start()方法,等待CPU调度。此时,线程已经分配到了CPU资源,并准备执行任务。

  3. BLOCKED:阻塞状态,表示线程在等待锁的释放。当一个线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞,直到该锁被释放。

  4. WAITING:等待状态,表示线程正在等待某个条件的发生。例如,调用Object.wait()方法会使线程进入等待状态,直到其他线程调用Object.notify()或Object.notifyAll()方法唤醒它。

  5. TIMED_WAITING:限时等待状态,表示线程正在等待某个条件的发生,并且设置了等待时间。例如,调用Thread.sleep(long millis)方法会使线程进入限时等待状态,直到指定的时间过去或者被其他线程中断。

  6. TERMINATED:终止状态,表示线程已经完成任务或出现异常而结束。此时,线程不再占用任何系统资源,可以安全地结束其生命周期。

 代码演示

public class Main {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个新的线程
        Thread thread1 = new Thread(()-> System.out.println("1"));

        Thread thread2 = new Thread(()-> {
            while (true){

            }
        });
        thread2.start();

        Thread thread3 = new Thread(()-> {
            try {
                synchronized (Main.class){
                    Thread.sleep(10000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("3");
        });
        thread3.start();

        Thread thread4 = new Thread(()-> {
            try {
                thread2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("4");
        });
        thread4.start();

        Thread thread5 = new Thread(()-> {
            synchronized (Main.class){
                System.out.println("5");
            }
        });
        thread5.start();

        Thread thread6 = new Thread(()-> System.out.println("6"));
        thread6.start();
        thread6.join();
        System.out.println(thread1.getState());
        System.out.println(thread2.getState());
        System.out.println(thread3.getState());
        System.out.println(thread4.getState());
        System.out.println(thread5.getState());
        System.out.println(thread6.getState());
    }
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/352550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

element plus使用问题

文章目录 element plusvue.config.js注意1、有时候会报错 not a function2、使用 ElMessage 报错3、 element plus 版本过高4、警告Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined.5、报错 ResizeObserver loop completed with undelivered noti…

网络基础---初识网络

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、局域网…

读取一个batch的图像并且显示出来

1读取一个batch用于训练 我们在训练模型的时候,除了观察图像的标签和尺寸,最好能读取一个batch的图像显示出来,观察原始图像和grountruth是否对应,如果正确才能正式开始后续的训练。 下面以一个皮肤病分割的数据集加以演示。 2…

保障接口安全的11个方法

一、参数校验 校验参数是否为空,有些接口中可能会包含多个参数,有些参数允许为空,有些参数不允许为空,需要对这些参数做校验,防止接口底层出现异常。校验参数类型,比如:age 是 int 类型的&…

对鸢尾花进行分类预测-----pycharm

项目说明 #项目: 对鸢尾花进行分类预测 #实例数量150个(3类各50个) #属性数量:4(数值型,数值型,帮助预测的属性和类) #特征:花萼长度,花萼宽度,花瓣长度,花瓣宽度 单位&#xff1…

HarmonyOS 鸿蒙组件启动规则(Stage模型)

组件启动规则(Stage模型) 启动组件是指一切启动或连接应用组件的行为: 启动UIAbility、ServiceExtensionAbility、DataShareExtensionAbility,如使用startAbility()、startServiceExtensionAbility()、startAbilityByCall()等相关…

FOC系列(五)----STM32F405RGT6控制板焊接与初步编写代码

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    首先祝大家新年快乐,因为我也快放假了,驱动板只能是开学之后再去测试了,本篇博客应该是本专栏年前的最后一篇了 一…

【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

字符串相关的函数和内存块相关函数

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

[学习笔记] ONNX 基础知识

1. ONNX 简介 1.1 什么是 ONNX 开放神经网络交换 ONNX(Open Neural Network Exchange)是一套表示深度神经网络模型的开放格式,由微软和 Facebook 于 2017 推出,然后迅速得到了各大厂商和框架的支持。通过短短几年的发展&#xf…

【JavaEE进阶】 #{}和${}

文章目录 🍃前言🌳#{}和${}使⽤🚩Interger类型的参数(基础数据类型)🎈使用#{}🎈使用${} 🚩String类型的参数使用🎈#{}使用🎈${} 🎍#{}和${}区别&a…

林浩然与极限的“无穷”约会

林浩然与极限的“无穷”约会 Lin Haoran’s Encounter with the Mathematical “Infinity” 在数学王国里,有一位名叫林浩然的大侠,他的江湖就是高等数学的殿堂。而他要挑战的终极Boss,便是那个既神秘又顽皮的“极限”。 In the kingdom of …

《golang设计模式》第三部分·行为型模式-10-模板方法(Template Method)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 模板方法(Template Method)用来定义算法的框架,将算法中的可变步骤定义为抽象方法,指定子类实现或重写。 1.1 角色 AbstractClass(…

字符串相关函数【超详细】(strcpy,strstr等string.h中的函数)

文章目录 strlen库中函数定义函数作用函数大概“工作”流程函数使用注意(要求)函数使用例举 strcpy库中函数定义函数作用函数使用注意(要求)函数大概“工作”流程函数使用例举 strcat库中函数定义函数作用函数使用注意&#xff08…

Go 的命令行解析 flag 包如何扩展新类型呢?

上篇文章 说到,除布尔类型 Flag,flag 支持的还有整型(int、int64、uint、uint64)、浮点型(float64)、字符串(string)和时长(duration)。 flag 内置支持能满足…

transformer和vit学习笔记

以下记录自己对transformer的学习笔记,可能自己看得懂【久了自己也忘了看不懂】,别人看起来有点乱。以后再优化文档~ 小伙伴请直接去看学习资源: Transformer的理解T-1_哔哩哔哩_bilibili 首先,时序处理:一些模型的出…

Two-factor authentication (2FA) is required for your GitHub account解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【基于电商履约场景的 DDD 实战】DDD业务建模第二部分:履约的战术设计(梳理整个战术设计流程图)

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

Java笔记 --- 二、Stream流

二、Stream流 结合Lambda表达式,简化集合、数组的操作 获取Stream流对象 单列集合获取Stream流 双列集合获取Stream流 数组获取Stream流 一堆零散的数据获取Stream流 Stream流的静态方法of的形参是一个可变参数,可以传递零散数据,也可以传递…

【Python】02快速上手爬虫案例二:搞定验证码

文章目录 前言1、不要相信什么验证码的库2、以古诗文网为例,获取验证码1)code_result.py2)gsw.py 前言 提示:以古诗文网为例,获取验证码: 登录:https://so.gushiwen.cn/user/login.aspx 1、不…