c++thread里暂停线程_Java线程的 6 种状态

作者:( •̀ ω •́ )y

出处:https://www.cnblogs.com/laishenghao/p/13972421.html

一、线程状态的枚举

Java的线程从创建到销毁总共有6种状态。这些状态被定义在Thread类种的内部枚举 State 中,分别如下:

1、NEW:初始状态。

线程实例已创建,但未启动。

// 实例创建后,初始状态为 NEWThread thread = new Thread();

2、RUNNABLE:运行状态。

线程正在JVM中执行或等待操作系统资源(如CPU),包含 Ready(就绪)状态和 Running(运行中)状态。

(1) Ready 状态:该线程在可运行的状态,但在此刻线程调度器并没有选择执行该线程。

(2) Running 状态:此刻线程调度器选择执行该线程,线程得到了CPU的时间片资源。

3、BLOCKED:阻塞状态。

线程在等待获取监视器锁资源,以便进入 synchronized 标记的方法或者代码块。

4、WAITING:等待状态。

当调用以下方法后,线程将进入等待状态:

(1) Object.wait(); // 调用不带超时参数的 wait() 方法。

(2) anotherThread.join(); // 调用另一个线程的不带超时参数的 join() 方法。

(3) LockSupport.park(); / / 无限期挂起当前线程。

5、TIMED_WAITING:超时等待状态。

指定了超时时间的等待状态。当线程调用了如下方法后,线程将进入超时等待状态:

(1) Thread.sleep(long millis)Thread.sleep(long millis, int nanos)

(2) Object.wait(long timeout)Object.wait(long timeout, int nanos)

(3) anotherThread.join(long millis)anotherThread.join(long millis, int nanos)

(4) LockSupport.parkNanos(Object blocker, long nanos)LockSupport.parkUntil(Object blocker, long deadline)

可以看到,跟 WAITING 状态相比,引起 TIMED_WAITING 状态的方法,主要是多了超时参数。

6、TERMINATED:终止状态。

线程执行完成或被中断,将进入终止状态。进入终止状态后的线程,无法重启启动。

如果再次调用 start() 方法,将会抛出 IllegalThreadStateException 异常。

调用 run() 方法也不会有任何效果,线程内部的 Runnable 对象也已经被释放。

二、线程状态的转换

Java线程状态的转换过程,如下图所示。

09136173189005146c497bdc275e77be.png

三、线程状态的获取

当前线程的状态可以通过 Thread.currentThread().getState() 获取。显然,获取自己的状态,得到的肯定是运行状态。

一个线程实例的状态,可以通过 thread.getState() 方法获取。

public class Main {    public static void main(String[] args) throws InterruptedException {        Thread thread = new Thread(() -> {            // running:RUNNABLE            System.out.println("running:" + Thread.currentThread().getState());            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }        });        // before start():NEW        System.out.println("before start():" + thread.getState());        thread.start();        // 暂停一下主线程        Thread.sleep(100);        // 由于线程内sleep了1秒,此时将处于有限时间等待状态        // after start():TIMED_WAITING        System.out.println("after start():" + thread.getState());        // 等待线程结束        thread.join();        // thread state:TERMINATED        System.out.println("thread state:" + thread.getState());    }}

测试Lock对应的线程状态:

public class Main {    private static final Lock LOCK = new ReentrantLock();    private static volatile int value = 0;    public static void main(String[] args) throws InterruptedException {        Thread alice = new Thread(() -> testLock("Alice"));        Thread bob = new Thread(() -> testLock("Bob"));        // alice before start():NEW        System.out.println("alice before start():" + alice.getState());        alice.start();        // 暂停一下主线程        Thread.sleep(100);        bob.start();        Thread.sleep(100);        // bob.getState():WAITING        System.out.println("bob.getState():" + bob.getState());        value = 1000;    }​    static void testLock(String name) {        // 注意:锁住的是代码块,不是里面用到的变量、资源        LOCK.lock();        try {            System.out.println("Lock block code, name=" + name);            // 注意:这是非线程安全的操作            value += 10;            System.out.println("Before sleep(): name=" + name + ",value=" + value);            Thread.sleep(1000);            System.out.println("After sleep(): name=" + name + ",value=" + value);        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            LOCK.unlock();        }    }}

由上面的例子可见,等待进入 Lock.lock() 代码块的线程的状态,是 WAITING 状态,而不是 BLOCKED。

如果调用的是 Lock.tryLock(long, TimeUnit) 方法,对应的状态将是 TIMED_WAITING。

作者:( •̀ ω •́ )y

出处:https://www.cnblogs.com/laishenghao/p/13972421.html

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

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

相关文章

hp服务器装xp系统,教你惠普笔记本一键装xp系统的方法

前几天小编闲来无事就跑到网站底下查看粉丝朋友给小编我留言询问的问题,还真的就给小编看到一个问题,那就是惠普笔记本xp系统安装方法,其实小编我有一个十分简单的安装方法可以提供给大家,大家一起来跟小编我一起看看吧。1、首先我…

外链引入css有哪些方式_快速收录的外链操作技巧

外链似乎还依然是大部分行业获取关键词排名的主要方法,现在早已经过来外链是王道的时代。但是对于处于关键词排名前期的新站,外链的作用依然很大。如何才能让我们发布的外链快速被收录然后被计入关键词排名呢?有如下6点需要注意的:一、寻找收…

华为路由器A1如何设置虚拟服务器,华为路由器A1如何设置虚拟服务器

华为路由器A1如何设置虚拟服务器 内容精选换一换当您在使用VPC的路由表功能时,需要在弹性云服务器上部署SNAT,使得VPC内其他没有绑定EIP的弹性云服务器可以通过它访问Internet。该配置对VPC内所有子网生效。已拥有需要部署SNAT的弹性云服务器。待部署SNA…

ad域同步其他ldap账号_域渗透——普通用户权限获得DNS记录

0x00 前言在之前的文章《域渗透——DNS记录的获取》介绍了域渗透中获得DNS管理员权限后获取DNS记录的方法,而更普遍的情况是只有域普通用户的权限,也需要获得DNS记录。本文将会参考公开的资料,整理域普通用户获得DNS记录的方法,修…

dom4j实现为list添加父节点_Heap 堆的实现

堆(数据结构)什么是堆堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树的数组对象堆的性质这种用数组实现的二叉树,假设节点的索引值为index,那么:节点的左孩子节点是 2*index1,节点的右孩…

acer软件保护卡清除工具clear_如何清除 APT 缓存来回收宝贵的磁盘空间 | Linux 中国...

导读:在本教程中,我将解释什么是 APT 缓存、为什么会使用它、为什么你要清理它,以及关于清理 APT 缓存你应该知道的其他事情。本文字数:2132,阅读时长大约:3分钟https://linux.cn/article-12787-1.html作者…

检测正常和不正常图_医生提醒:激素正常不等于内分泌正常,带你走出内分泌失调误区...

内分泌失调是女性常见的问题,特别是压力较大的都市女性,常常因为内分泌失调而导致月经紊乱,同时皮肤状态也变得糟糕,让她们很是心烦。一旦怀疑自己是内分泌失调,不少女性都会进行相应的激素检测,但如果检测…

antd 判断input输入内容是否大于_Python基础语法 | 代码规范amp;判断语句amp;循环语句...

Python基础语法代码的执行顺序从上到下从左到右代码规范模块名,包名,普通数据量一般小写字母,多个单词之间用 _ 连接不要用系统定义的名称,具有特殊意义的表示符,如:doc,txt之类的每行代码不易过长单个字母…

小米手环导出心率_这个功能有意思,小米11支持指纹检测心率,没有手环也不怕...

原标题:这个功能有意思,小米11支持指纹检测心率,没有手环也不怕昨晚,小米发布了新一代数字旗舰小米11,在处理器和屏幕等方面都做了升级,相比于这些重点,有一项新功能的介绍篇幅不是很多&#xf…

用单片机测量流体流速的_金属管转子流量计基本测量原理

金属管转子流量计的主体构件是一根金属材质的锥形测量管,测量元件是一个内置磁钢的转子(或称浮子),故而得名。金属管的锥度通常在4左右,下端截面积略小于上端;转子直径略小于金属管内径,形成一个…

css如何调整红心样式_在JavaScript应用程序中包含CSS的多种方法「渡一」

原文链接:https://css-tricks.com/the-many-ways-to-include-css-in-javascript-applications/,作者:Dominic Magnifico如有翻译不准确,请多指正。欢迎来到这个在前端开发领域极具争议性的话题!我相信读到这篇文章的大…

小新pro13 重装注意_新款小新pro 13注意什么?买前必读

导读:看到这一款本本,你的感觉是什么呢?精巧、美丽,性能强劲还是高分辨的屏幕呢?一起看一看2020款的联想(Lenovo)小新Pro13,要注意哪些事项?请听小编简单跟你唠几句~1、买联想小新pro的&#xf…

服务禁止方法_Linux禁止ping以及开启ping的方法

今天浏览一个网站,本着好奇的心态ping一下,发现不管是ping域名和IP都是不通的。这就比较郁闷了,后来百度后知道原来服务器是可以设置禁止ping的,看来是我孤陋寡闻了,接下来给大家分享一下服务器如何禁止ping。Linux默认…

java 多态判断非空_Java核心技术(四):继承

本章目录:一、类、超类和子类1.多态2.动态绑定3.阻止继承:final类和方法4.抽象类5.访问修饰符总结二、Object类:所有类的父类1.equals方法2.hashcode方法3.toString方法三、对象包装器与自动装箱四、反射1.Class类2.捕获异常3.利用反射分析类…

互相引用 spring_听说你还不知道Spring是如何解决循环依赖问题的?

作者:Vt前言Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题。其实笔者本人对这类框架源码题还是持一定的怀疑态度的。如果笔者作为面试官,可能会问一些诸如“如果注入的属性为null,你会从哪几个方向去排查”这些场景…

打印多页时两边取消留白_办公必备技巧:Word打印技巧大全

打印是每一位办公族都要掌握的一项最基础的技能。平常在用WORD写作、对文章进行排版等,最终我们都是需要将其打印到纸张上。在打印中有着众多的操作技巧,如果你还不会,那今天易老师就来给你科普一下。本文目录第一部分:基础打印操…

中raise抛出异常_Python 异常处理知识点汇总,五分钟就能学会 !

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不分高级语言一样,使用了try/except/finally语句块来处理异常,如果…

easyexcel多个sheet导入_Java中Easypoi实现excel多sheet表导入导出功能

Easypoi简化了开发中对文档的导入导出实现,并不像poi那样都要写大段工具类来搞定文档的读写。第一步引入Easypoi依赖cn.afterturneasypoi-spring-boot-starter4.2.0Easypoi的注解使用说明(存留查看即可)第二步定义对应表格头数据对象实体类(注解的使用可以查阅上面的…

mysql 严格模式_MySQL 开启/关闭 严格模式(Strict Mode)

[广告:最高 2000 红包]阿里云服务器、主机等产品通用,可叠加官网常规优惠使用 | 限时领取查看 Mysql 是否开启严格模式:打开 MySQL 配置文件 my.cnf(windows为my.ini)。搜索 sql-mode 如果搜索不到就代表 非严格模式 。搜索到了就代表开启了严…

mysql 导入日期 0000_解决Excel导入MySQL日期为0000-00-00

最近在为客户做一个库存升级改造的项目,之前客户的数据管理全部是在Excel中操作,估计以前也是没有意识到数据量变大以后,工作会变得如此困难,基本上处于一个无法操作的程度了。于是我们将旧版本的Excel表格格式化以后,…