Java并发(十一)----线程五种状态与六种状态

news2024/12/26 0:03:36

1、五种状态

这是从 操作系统 层面来描述的

  • 【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联

  • 【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行

  • 【运行状态】指获取了 CPU 时间片运行中的状态

    • 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换

  • 【阻塞状态】

    • 如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入【阻塞状态】

    • 等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】

    • 与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们

  • 【终止状态】表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态

2、六种状态

这是从 Java API 层面来描述的,根据 Thread.State 枚举,分为六种状态

  • NEW 线程刚被创建,但是还没有调用 start() 方法

  • RUNNABLE (RUNNING)当调用了 start() 方法之后,注意,Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的【可运行状态】、【运行状态】和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行)

  • BLOCKEDWAITINGTIMED_WAITING 都是 Java API 层面对【阻塞状态】的细分,后面会在状态转换一节详述

  • TERMINATED 当线程代码运行结束

代码示例

@Slf4j(topic = "c.TestState")
public class TestState {
    public static void main(String[] args) throws IOException {
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug("running...");
            }
        };  // 未start  所以日志未打印
​
        Thread t2 = new Thread("t2") {
            @Override
            public void run() {
                while(true) { // runnable
​
                }
            }
        };
        t2.start();
​
        Thread t3 = new Thread("t3") {
            @Override
            public void run() {
                log.debug("running...");
            }
        };
        t3.start();
​
        Thread t4 = new Thread("t4") {
            @Override
            public void run() {
                synchronized (TestState.class) {
                    try {
                        Thread.sleep(1000000); // timed_waiting
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        t4.start();
​
        Thread t5 = new Thread("t5") {
            @Override
            public void run() {
                try {
                    t2.join(); // waiting
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t5.start();
​
        Thread t6 = new Thread("t6") {
            @Override
            public void run() {
                synchronized (TestState.class) { // blocked
                    try {
                        Thread.sleep(1000000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        t6.start();
​
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.debug("t1 state {}", t1.getState());
        log.debug("t2 state {}", t2.getState());
        log.debug("t3 state {}", t3.getState());
        log.debug("t4 state {}", t4.getState());
        log.debug("t5 state {}", t5.getState());
        log.debug("t6 state {}", t6.getState());
        System.in.read();
    }
}

输出

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio实现贪吃蛇小游戏

项目目录 一、项目概述二、开发环境三、详细设计四、运行演示五、项目总结 一、项目概述 贪吃蛇是一款经典的街机游戏,不仅在电子游戏史上占有一席之地,也在很多人的童年回忆中留下了深刻的印象。在游戏中,玩家需要操纵一条蛇通过吃食物来增…

leetcode222. 完全二叉树的节点个数(java)

完全二叉树的节点个数 leetcode222. 完全二叉树的节点个数题目描述 递归广度优先遍历二叉树专题 leetcode222. 完全二叉树的节点个数 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/count-complete-tree-nodes 题目描述…

Linux下的打包和压缩/解压解包

文章目录 一、打包和压缩二、Linux下进行打包和压缩1.zip指令,unzip指令2.tar指令 一、打包和压缩 打包呢就是把所有东西装在一起,然后压缩就是将这一包东西给它合理摆放,腾出更多的空间,以便放更多的东西。 压缩可以将如果东西是…

【github加载不出来】github 加载不出来、获取GitHub官方CDN地址、修改系统Hosts文件 刷新缓存

目录 github 加载不出来获取GitHub官方CDN地址修改系统Hosts文件刷新缓存 github 加载不出来 获取GitHub官方CDN地址 https://www.ipaddress.com/打开后如图,右上角搜索查 查找这三个DNS链接的解析地址 http://github.com http://assets-cdn.github.com http://git…

java springboot整合Druid数据源配置

整合的最后一块 我们整合一个数据源 Druid 我们还是打开idea 创建一个项目 路径和版本调一下 路径选一个好的目录就可以了 至于版本 最好是 java 8 JDK 1.8 然后 Next 下一步 这里 spring boot 的版本记得选一下 不要搞太高 2.几即可 Druid 在这里 显然也是找不到的 所以 我…

安卓端Google隐私沙盒归因报告聚焦

自2022年2月Google首次提出将推出隐私沙盒至今已一年有余。现在,安卓端的隐私沙盒Beta测试已针对特定Android13设备正式开始。作为早期测试者,Adjust很高兴与 Google一同迈出增强用户隐私的第一步,并在接下来的旅程中继续携手同行。为帮助移动…

framework编译应用代码

代码编译 APP或Service代码单编调试 1、在aosp文件目录下在将环境变量加载到内存中,在终端中输入下面命令 source build/envsetup.sh 2、选择平台编译选项 lunch 3、输入后会出现一个选择列表,然后输入你想要的项目的序号即可。如下所示我这里选择的7…

【OpenMMLab AI实战营二期笔记】第十天 底层视觉与MMEditing

1.图像超分辨率 1.1 什么是图像超分辨率? 根据从低分辨率图像重构高分辨率图像 1.2 目标: 提高图像的分辨率高分图像符合低分图像的内容恢复图像的细节、产生真实的内容 1.3 应用: 经典游戏高清重制动画高清重制照片修复节约传输高清图…

当你拥有什么样的高性能计算技术水平,你才能成为一名高性能计算工程师? ...

在当今科技快速发展的时代,高性能计算工程师成为了推动科学研究、工程仿真和大数据处理的关键人才。尤其是我国大力发展科研基建,打造科研技术底座,这就更加需要高性能计算工程师通过自身的技术来加速科研建设和研发的进度和速度。 我们调研了…

Spark大数据处理学习笔记(3.8.1) Spark RDD典型案例-利用RDD计算总分与平均分

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Twpwe】 文章目录 1. 任务目标2. 实现思路3. 准备工作3.1 启动HDFS服务3.2 启动Spark服务3.3 在本地创建成绩文件3.4 将成绩文件上传到HDFS 4. 完成任务4.1 在Spark Shell里完成任务4.1.1 读取成绩…

虚拟机使用

文章目录 VMWare安装Warning 系统安装MacOS解锁工具Unlocker Warning VMWare配置系统启动安装VMware tools联网 VMWare安装 Warning 安装完VMWare后要在BIOS中开启intel VT(虚拟化),否则安装过程中会出错,提示“Intel VT-x处于禁…

写在2023年,回看10年前,很幸运进了软件测试这行~

首先介绍一下我自己,从事软件测试行业到现在是10年时间,毕业之后一直从事的软件测试行业。很幸运在毕业时赶上互联网这波浪潮,然后就一直在互联网公司工作,虽然那时候的软件测试技术发展还相对比较混乱,但自己因为公司…

CAN 报文字节排列顺序(Intel、Motorola_LSB、Motorola_MSB)

学习自记: 在定义CAN通信矩阵或制作dbc时,我们需要知道报文的字节排列顺序。字节的排列顺序有2种,一种是Intel的排列顺序,另一种是Motorola的排列顺序,就跟大小端字节排序是一样的。下面笔者将简单介绍这2种字节排序的…

在conda环境中安装tensorflow和cuda

​ 不同版本的tensorflow官方提供的编译好的whl文件只对应一个cuda版本,这让需要tensorflow的不同版本时很麻烦。 我选择的方式是在conda中新建一个环境,在环境中安装需要的tensorflow和cudatoolkit。 这里假设已经安装好anaconda。 确定需要的tensorflo…

服了呀,现在的00后,真的是卷死了,辞职信已经写好准备提交了·····

都说00后躺平了,但是有一说一,该卷的还是卷。这不,四月份春招我们公司来了个00后,工作没两年,跳槽到我们公司起薪22K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了…

数智赋能与低代码:是医药行业的创新引擎还是心魔歧途

医药行业在当下科技水平的推动下实现了突破性的进展,提高了疾病的治疗效果、加速了新药的开发速度,并为病患提供了更便捷、个性化的医疗服务。当前科技水平下的医药行业正在经历快速的发展和创新。AI 在医药研发、诊断和治疗方面扮演着重要角色。机器学习…

软件测试中的可用性、可维护性、可靠性有什么区别?

我们生活在一个用户依赖于对服务的一致访问的可靠性时代。在相互竞争的服务之间进行选择时,对用户来说,没有比可靠性更重要的特性了。但是可靠性是什么意思呢? 为了回答这个问题,我们将根据可靠性工程中的其他度量来分解可靠性&a…

接口自动化测试的一种方案

前言 去年,我们进行了项目的拆分,拆分后的各个子系统也都逐步的改成了通过接口进行数据的交换,接口测试也被提上日程。经过一段时间的探索,接口自动化测试方案越来越完善,今天给大家做个详细的讲解。 方案 目前我们…

5分钟快速学会App自动化测试xpath定位【快点收藏吧】

今天我们先来和大家说一下appium,首先教大家如何定位xpath,五分钟即可学会: 例: 现在我想定位下面这个登录按钮:​ ​xpath该怎么写呢? 先不管三七二十几,先写//,然后找你要定位元…

中国信通院携手合合信息开启《文档图像篡改检测标准》制定工作

文档图像是信息的重要载体,却经常被不法分子利用软件、算法进行篡改。这些虚假材料往往被用于散播谣言、经济诈骗、编造虚假新闻,给个人、社会造成了恶劣的影响。AIGC全球爆火后,人们对“生成式造假”风险的攀升倍感忧虑,图像内容…