Java线程的六种状态(付代码解释)

news2024/12/26 22:10:22

目录

一.新建状态 (New)

解释

代码

运行结果

​编辑

二.运行状态(Runnable) 

 解释

代码

运行结果

 三.等待状态(Waiting)

解释

代码

运行结果

 四.阻塞状态(Blocked)

解释

代码

运行结果

 五.计时等待状态(Timed Waiting)

解释

代码

运行结果

 六.终止状态(Terminated)

解释

代码

运行结果

状态之间的切换条件

新建状态(New):

运行状态(Runnable):

阻塞状态(Blocked):

等待状态(Waiting):

计时等待状态(Timed Waiting):

终止状态(Terminated):


Java线程一共有六种状态,分别是

新建状态(New)

运行状态(Runnable)

阻塞状态(Blocked)

等待状态(Waiting)

计时等待状态(Timed Waiting)

终止状态(Terminated)

一.新建状态 (New)

解释

线程仅仅是被创建,但未被调用的状态

代码

getState查看线程状态

public class demo14 {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            
        });
        System.out.println(t1.getState());
    }
}

运行结果

二.运行状态(Runnable) 

 解释

[正在运行中的]  或者  [已经能够运行]  的线程

代码

只是加了一个start调用

public class demo14 {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{
            
        });
        t1.start();
        System.out.println(t1.getState());
    }
}

运行结果

 三.等待状态(Waiting)

解释

正在运行中的线程被中断后,处于被通知状态的等待状态,一旦接收到通知就继续运行

代码

调用wait方法让线程处于等待状态

public class demo14 {
     public static void main(String[] args) throws InterruptedException {
         Object ob = new Object();
         Thread t1 = new Thread(()->{
             synchronized (ob){
                 try {
                     ob.wait();
                 } catch (InterruptedException e) {
                     throw new RuntimeException(e);
                 }
             }
        });
         t1.start();
         Thread.sleep(1000);//这里sleep是为了避免主函数运行过快,显示Runnable
         System.out.println(t1.getState());
    }
}

运行结果

 四.阻塞状态(Blocked)

解释

多个线程竞争同一个锁,竞争失败的线程会处于该状态

代码

此时t2和t1同时竞争名为func的枷锁方法

因为t2先获得,所以t1只能处于阻塞等待

public class demo14 {
    synchronized public static void func() {
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
     public static void main(String[] args) throws InterruptedException {
         Thread t1 = new Thread(()->{
             func();
         });

         Thread t2 = new Thread(()->{
             func();
         });
//t2先获得锁,t1只能阻塞等待
         t2.start();
         t1.start();
         System.out.println(t2.getState());
         System.out.println(t1.getState());
    }
}

运行结果

 五.计时等待状态(Timed Waiting)

解释

和等待相似,但是区别在于限定了一个时间,如果超过时间则取消等待,继续执行

代码

public class demo14 {
    public static void main(String[] args) throws InterruptedException {
        Object ob = new Object();
        Thread t1 = new Thread(()->{
            synchronized (ob){
                try {
                    ob.wait(10000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t1.start();
        Thread.sleep(1000);//这里sleep是为了避免主函数运行过快,显示Runnable
        System.out.println(t1.getState());
    }
}

运行结果

 六.终止状态(Terminated)

解释

线程运行结束,释放所有资源

代码

public class demo14 {
    public static void main(String[] args) throws InterruptedException {
        Object ob = new Object();
        Thread t1 = new Thread(()->{
        });
        t1.start();
        Thread.sleep(1000);//这里sleep是为了让线程运行完毕,避免主函数运行过快显示Runnable
        System.out.println(t1.getState());
    }
}

运行结果

 

状态之间的切换条件

新建状态(New):


被创建就自动进入该状态

运行状态(Runnable):


被调用(如start)后进入该状态

阻塞状态(Blocked):


竞争锁失败后进入该状态

等待状态(Waiting):


运行被中断(如wait),处于等待唤醒状态时进入该状态

计时等待状态(Timed Waiting):


如果被带有时间的wait等方式中断,进入等待唤醒状态时进入该状态

终止状态(Terminated):


全部执行完毕后,没有出错释放资源,进入该状态

 

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

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

相关文章

PCB设计系列分享-开关稳压器接地处理

目录 概要 整体架构流程 技术名词解释 1.DCDC: 2.PGND: 3.AGND: 技术细节 1.认识1 2.认识2 3.综合 小结 概要 提示:这里可以添加技术概要 如何使用带有模拟接地层(AGND)和功率接地层(PGND)的开关稳压器? 这是许多开发人员在设计…

启用Windows应急重启功能

博主最近发现了Windows隐藏功能——应急重启,并且这个功能可以追溯到Windows Vista!但是因为大家习惯长按电源键关机所以就鲜为人知。今天博主叫你如何使用应急重启功能。 因为使用功能都无法截图,所以就不展示图片了。 第一步,按住CtrlAltD…

什么是元宇宙?元宇宙由哪些关键技术、设备构成?

元宇宙近几年来火爆起来,各个行业争先恐后加入。从目前来看,元宇宙初步体现在游戏娱乐行业、社交、消费、数字孪生等方面。元宇宙近两年开始在各个行业快速崛起,但各个行业并没有一个清晰的发展方向,那么什么是元宇宙? 元宇宙到底由哪些技术和设备组成?查询了很多资…

用于SOLIDWORKS装配体的X光机——SOLIDWORKS装配体直观工具

​ SOLIDWORKS报告和故障排除的瑞士军刀 如何快速的根据条件会装配体中的零部件进行分类? 如何快速找到装配体中的某些特定零件? 如何快速在图形区域中突出显示出特定的零部件? 如果你用过“SOLIDWORKS装配体直观工具”的话,…

JMeter之常见逻辑控制器实践

ForEach Controller(循环控制器) 组件使用说明 选项说明: ①需要循环遍历名称(name); ②循环变量的下标起点(name_0); ③循环变量的下标终点(name_4); ④引用变量名称定义; ⑤在变量后加_&…

jsvmp xs逆向学习

内容仅供参考学习 欢迎朋友们V一起交流: zcxl7_7 首先直接搜索关键词 找到encrypt位置 接下来就是分析encrypt过程,详情请看专栏中的文章

leetcode 2448. Minimum Cost to Make Array Equal(使数组相等的最小成本)

数组nums的元素每次可进行下面的操作: 每个元素1 或者 -1。 操作一次的cost是cost[i]. 问把nums的元素全部变为相等的元素需要的最小的cost. 思路: nums的元素全部变为相等的元素,这个相等的元素是多少,现在不知道。 一旦知道了…

Jmeter查看结果树之查看响应的13种方法

目录 前言: 1、Text 2、RegExpTester 3、BoundaryExtractorTester 4、CSSSelectorTester 5、XpathTester 6、JSONPathTester 7、HTML 8、HTMLSourceFormatted 9、HTML(downloadresources) 10、Document 11、JSON 12、XML 13、B…

RPA×IDP×AIGC,实在智能打造全新“超进化”文档审阅超自动化解决方案

企业商业活动频繁,每日都有大量文档被创建、书写、传递,需要人工审阅核查,以确保其准确性和合法性。这是对企业文档管理的一个巨大挑战,尤其对于金融机构、审计机构等文本相关岗位的工作人员来说更是如此。传统的文档审核通常需要…

集合和泛型的详细讲解

集合 1)可以动态保存任意多个对象,使用比较方便! 2)提供了一系列方便的操作对象的方法:add、remove、set、get等3)使用集合添加,删除新元素的示意代码-简洁了 集合的框架体系 …

实时检测Aruco标签坐标opencv-python之添加卡尔曼滤波

在实时检测Aruco标签坐标用于定位的时候发现,追踪效果不是很好,于是在检测过程中添加了卡尔曼滤波,在aruco检测算法检测不到aruco标签的时候,调用卡尔曼滤波算法(KalmanFilter),补偿丢失的定位的…

Rabbitmq学习

文章目录 前言RabbitMQ 1 同步调用和异步调用2 常见的MQ对比3 安装RabbitMQ4 RabbitMQ学习4.1 helloworld学习 5 Spring AMQP5.1 AMQP的入门案例(使用rabbittemplate进行消息发送和接受)5.2 RabbitMQ的workquene5.3 发布订阅模型(exchange(广播fanout 路由direct 话题topic))5.…

RK3588 修改USB/Sata/TF挂载点

文章目录 概要整体架构流程技术名词解释技术细节小结APP概要 rk3588 android12 平台的挂载点是:/storage/设备卷名(即uuid) 对上层开发不太友好,因此需要固定某个挂载点提供上层app调用。 修改后的路径效果如下: 整体架构流程 从概要图示中可知:对每个挂载点创建软连接来…

大牛分享,提高工程性能的7个简单技巧

软件性能和弹性(恢复能力)是用户体验的关键组成部分,但随着软件行业采用DevOps,它开始在性能和弹性方面出现不足。在软件完全失败之前,性能问题经常被忽略。 但是,我们都知道性能不会突然降低。随着软件通…

【二叉树part02】| 102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树

目录 ✿LeetCode102.二叉树的层序遍历❀ ✿LeetCode226.翻转二叉树❀ ✿LeetCode101.对称二叉树❀ ✿LeetCode102.二叉树的层序遍历❀ 链接:102.二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地&#xff…

Python入门(二十七)测试(二)

测试(二) 1.测试类2.各种断言方法3.一个要测试的类4.测试AnonymousSurvey类5.方法setUp() 1.测试类 前面我们编写了针对单个函数的测试,下面来编写针对类的测试。很多程序中都会用到类,因此证明我们的类能够正确工作大有裨益。如…

AI绘画——了解AI绘画爆火原因与工具,并生成几个端午绘画小作品

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.AI绘画 1.AI绘画爆火原因 2.AI绘画背后原理 二.AI绘画工具介绍 1.midjour…

IDC武连峰:应用数字安全免疫力理念,促进企业在数字时代韧性发展

作者:IDC中国副总裁、首席分析师 武连峰 数字安全免疫力是一个企业针对各种数字安全威胁时的防御机制,与人体免疫力相似,企业数字安全免疫力包含两类:企业安全文化意识与合规是先天性数字安全免疫力,今天任何一个企业…

vue使用swiper三行轮播问题

1、轮播图设置属性slidesPerColumn:3实现不了,解决方案如下: this.scheduleData是后台请求的数据,通过3个一组分组转换为this.scheduleListThreede 的数据! 2、逻辑处理如下: computed: { scheduleListThree: functi…

做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

前言 作为一名测试工程师,工作中在对测试结果进行数据比对的时候,或多或少要和数据库打交道的,要和数据库打交道,那么一些常用的sql查询语法必须要掌握。最近有部分做测试小伙伴表示sql查询不太会,问我有没有sql查询语…