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记录的方法,修…

vue项目统一响应_Vue响应式原理及总结

Vue 的响应式原理是核心是通过 ES5 的保护对象的 Object.defindeProperty 中的访问器属性中的 get 和 set 方法,data 中声明的属性都被添加了访问器属性,当读取 data 中的数据时自动调用 get 方法,当修改 data 中的数据时,自动调用…

lua虚拟机字节码修改_LUA虚拟机的字节码怎么看?

A : 8 bitsB : 9 bitsC : 9 bitsAx : 26 bits (A, B, and C together)Bx : 18 bits (B and C together)sBx : signed Bx比如这段:function y(...) print(...) end1 [1] GETTABUP 0 0 -1 ; _ENV "print"2 [1] VARARG 1 0 ; VARARG will set L->top3 [1]…

python数据结构中文版_Python官方入门教程_中文版_5.数据结构

5. 数据结构本章将详细介绍一些您已经了解的内容,并添加了一些新内容。5.1. 列表的更多特性列表数据类型还有很多的方法。这里是列表对象方法的清单:list.append(x)在列表的末尾添加一个元素。相当于 a[len(a):] [x] 。list.extend(iterable)使用可迭代…

xss挖掘思路分享_新手指南 | permeate靶场漏洞挖掘思路分享

简介最近在逛码云时候发现permeat靶场系统,感觉界面和业务场景设计的还不错.所以过来分享一下.同时也是分享一下我平时挖掘漏洞的一些思路吧,这篇文章里虽然只简单介绍其中三种漏洞类型,但也是想是一个抛转引玉吧,给web安全新手提供一些挖掘思路.下载地址:GitHub地址…

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

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

python concurrent queue_Python的并发并行[2] - 队列[0] - queue 模块

queue模块/ queue Module1常量/ ConstantsPass2函数/ FunctionPass3类/ Class3.1 Queue类类实例化:queue queue.Queue(maxsize0)类的功能:用于生成一个先入先出队列实例传入参数: maxsizemaxsize: int类型,队列的最大值,无空间时阻塞&#xf…

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

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

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

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

linux设置挂载服务端防火墙_「rpcbind」Linux下nfs+rpcbind实现服务器之间的文件共享(mount 挂载) - seo实验室...

rpcbind1、安装nfs和rpcbind检查自己的电脑是否已经默认安装了nfs和rpcbind:rpm -aq | grep nfsnfs-utils-1.2.3-54.el6.x86_64nfs4-acl-tools-0.3.3-6.el6.x86_64nfs-utils-lib-1.1.5-9.el6.x86_64rpm -aq | grep rpcbindrpcbind-0.2.0-11.el6.x86_64这表示系统已经…

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

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

zstd安装_PHP: 安装 - Manual

安装此 PECL 扩展未与PHP 捆绑。An example installation procedure on Ubuntu 18.04 with PHP 7.2:// Dependencies$ apt install build-essential libprotobuf-dev libboost-dev openssl protobuf-compiler liblz4-tool zstd// PHP with the desired extensions; php7.2-dev…

小米手环导出心率_这个功能有意思,小米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默认…