java线程6种状态转换,Java线程的生命周期和各种状态转换详解

1bab94a035328853b68d064028b11baa.gif

在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期。当Thread对象创建完成时,线程的生命周期便开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时,线程的生命周期便会结束。

Java官方API将线程的整个生命周期分为六个状态,分别是NEW(新建状态)、RUNNABLE(可运行状态)、BLOCKED(阻塞状态)、WAITING(等待状态)、TIMED_WAITING(定时等待状态)和TERMINATED(终止状态)。线程的不同状态表明了线程当前正在进行的活动,在程序中,通过一些操作,可以使线程在不同状态之间转换,如图1所示。

4803aa4c93eb3ba6a89d020950eb3c08.png

图1 线程状态转换图

图1中展示了线程各种状态的转换关系,箭头方向表示可转换的方向。接下来,针对线程生命周期中的六种状态分别进行详细讲解,具体如下:

1.NEW(新建状态)

创建一个线程对象后,该线程对象就处于新建状态,此时它不能运行,和其他Java对象一样,仅仅由JVM为其分配了内存,没有表现出任何线程的动态特征。

2.RUNNABLE(可运行状态)

当新建状态下的线程对象调用了start()方法,此时就会从新建状态进入可运行状态。从图10-10可以看出,在RUNNABLE状态内部又可细分成两种状态:READY(就绪状态)和RUNNING(运行状态),并且线程可以在这两个状态之间相互转换。

● 就绪状态:线程对象调用start()方法之后,等待JVM的调度,此时线程并没有运行;

● 运行状态:线程对象获得JVM调度,如果存在多个CPU,那么允许多个线程并行运行。

3.BLOCKED(阻塞状态)

处于运行状态的线程可能会因为某些原因失去CPU的执行权,暂时停止运行进入阻塞状态。此时,JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转换到运行状态。阻塞状态的线程只能先进入就绪状态,不能直接进入运行状态。

线程一般会在以下两种情况下进入阻塞状态:

● 当线程A运行过程中,试图获取同步锁时,却被线程B获取,此时JVM把当前线程A存到对象的锁池中,线程A就会进入阻塞状态;

● 当线程运行过程中,发出IO请求时,此时该线程也会进入阻塞状态。

4.WAITING(等待状态)

当处于运行状态的线程调用了无时间参数限制的方法后,如wait()、join()等方法,就会将当前运行中的线程转换为等待状态。

处于等待状态中的线程不能立即争夺CPU使用权,必须等待其他线程执行特定的操作后,才有机会再次争夺CPU使用权,将等待状态的线程转换为运行状态。例如,调用wait()方法而处于等待状态中的线程,必须等待其他线程调用notify()或者notifyAll()方法唤醒当前等待中的线程;调用join()方法而处于等待状态中的线程,必须等待其他加入的线程终止。

5.TIMED_WAITING(定时等待状态)

将运行状态中的线程转换为定时等待状态中的线程与转换为等待状态中的线程操作类似,只是运行线程调用了有时间参数限制的方法,如sleep(long millis)、wait(long timeout)、join(long millis)等方法。

处于定时等待状态中的线程也不能立即争夺CPU使用权,必须等待其他相关线程执行完特定的操作或者限时时间结束后,才有机会再次争夺CPU使用权,将定时等待状态的线程转换为运行状态。例如,调用了wait(long timeout) 方法而处于等待状态中的线程,需要通过其他线程调用notify()或者notifyAll()方法唤醒当前等待中的线程,或者等待限时时间结束后也可以进行状态转换。

6.TERMINATED(终止状态)

线程的run()方法、call()方法正常执行完毕或者线程抛出一个未捕获的异常(Exception)、错误(Error),线程就进入终止状态。一旦进入终止状态,线程将不再拥有运行的资格,也不能再转换到其他状态,生命周期结束。

猜你喜欢:

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

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

相关文章

window10怎么卸载php,window_win10怎么卸载程序?win10卸载程序教程,当win10正式版发布以后,不少 - phpStudy...

win10怎么卸载程序?win10卸载程序教程当win10正式版发布以后,不少用户将电脑升级为Windows10系统后,不知道该如何卸载程序,本篇将为大家带来win10卸载程序教程,希望能够帮助到大家。win10怎么卸载程序方法一&#xff1…

matlab里dcgain,制系统的时域分析

一个动态系统的性能常用典型输入作用下的响应来描述。响应是指零初始值条件下某种典型的输入函数作用下对象的响应,控制系统常用的输入函数为单位阶跃函数和脉冲激励函数(即冲激函数)。在MATLAB的控制系统工具箱中提供了求取这两种输入下系统响应的函数。一、时域分…

php 添加音乐,PHP网站插入音乐

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你找对地方了,我是IT之家大神光卡蒋一欣。我把代码发给你,直接运行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在oracle数据库中显示异常,Oracle数据库出现ORA-01034错误的解决方案

类型:数据库类大小:42.1M语言:中文 评分:5.0标签:立即下载使用Oracle数据库的朋友经常会碰到的错误ORA-3113 "end of fileon communication channel" 就是这样的一个,我们可以简单的把这个错误理…

oracle数据库内核,深入内核:Oracle数据库里SELECT操作Hang解析

崔华,网名 dbsnakeOracle ACE Director,ACOUG 核心专家编辑手记:感谢崔华授权我们独家转载其精品文章,也欢迎大家向“Oracle”社区投稿。我们都知道在 Oracle 数据库里是“读不阻塞写,写不阻塞读”,那么是否…

oracle 如何形成死锁,Oracle数据表中的死锁情况解决方法

在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定:1.查找被锁定的表:select object_name,session_id,os_user_name,oracle_username,process,locked_mode,statusfrom v$loc…

php 分布式数据库查询,分布式数据库 · Thinkphp5.0完全开发手册 · 看云

# 分布式数据库ThinkPHP内置了分布式数据库的支持,包括主从式数据库的读写分离,但是分布式数据库必须是相同的数据库类型。配置database.deploy 为1 可以采用分布式数据库支持。如果采用分布式数据库,定义数据库配置信息的方式如下&#xff1…

matlab 电力系统动态仿真,基于Matlab的电力系统动态仿真分析

本文通过两个简单实例介绍了利用 !"#$"% &’(! )*, -./对电力系统进行仿真研究的方法! 包括"热工自动调节控制系统的仿真分析和电力电器系统的仿真分析# 0 热工调节控制系统仿真分析 对热工调节控制系统的性能分析包括静态特性和动态特性两个方面# 这里主要…

oracle read by other session,AWR报告中,read by other session ,如何解决?

你看你的top sql里全是动态采样的sql,默认10g以后optimizer_dynamic_sampling参数为level 2,一般为缺失统计信息会造成每次使用动态采样,虽然动态采样会在表频繁发生大批量改变时,一般可以生成更好的执行计划,但是也不…

oracle insert into as select,比较create table as select * 与 insert into table select *

实验环境:SYSaaron> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE …

unix 安装oracle,linux上安装Oracle

当前位置:我的异常网 Linux/Unix linux上安装Oraclelinux上安装Oraclewww.myexceptions.net 网友分享于:2013-09-03 浏览:26次linux下安装Oracle1.Linux下安装 jdk(Linux)建议从sun的主页上下载bin文件,运行后在/usr/会建立好java目录的Linux下相关命…

linux ftp用户指定多个目录,linux ftp服务器下用户限制目录的方法

我们使用服务器都要站在安全方面进行考虑,有必要将ftp服务下的用户限制在适当的范围内,那么linux ftp服务器下用户限制目录的方法有哪些呢?一起跟着爱站技术频道小编的步伐来了解一下吧!linux ftp服务器下用户只能在自己目录下的方法:第一步…

查找空目录Linux,Linux中find批量删除空文件及空文件夹脚本

find . -name "*" -type f -size 0c | xargs -n 1 rm -f #linux下批量删除空文件(大小等于0的文件)删除指定大小的文件,只要修改对应的 -size 参数就行:find . -name "*" -type f -size 1024c | xargs -n 1 rm -f #删除1k大小的文件…

linux关闭timewait端口,linux 如何强制关闭 time_wait 连接

匿名用户1级2016-04-16 回答# netstat -an|awk /tcp/ {print $6}|sort|uniq -c68 CLOSE_WAIT2 CLOSING136 ESTABLISHED38 FIN_WAIT116 FIN_WAIT22 LAST_ACK8 LISTEN71 SYN_RECV2936 TIME_WAIT#状态:描述CLOSED:无连接是活动的或正在进行LISTEN&#xff1…

memset头文件 linux,error: ‘memset’ was not declared in this scope

http://blog.sina.com.cn/s/blog_79d599dc0100r2vz.html昨天一同事把代码准备重新全新布置到新的环境上去的时候,代码报错了,先开始报错如下:error: ‘memset’ was not declared in this scopeerror: ‘strcat’ was not declared in this s…

linux中ls文件内存大小,Linux下用ls和du命令查看文件以及文件夹大小

webdriver零碎知识点#零碎知识点,用于记录平时遇到的比较杂的知识点 driver.current_url 获取当前url phantomjs 实现无浏览器界面自动化测试(driver webdriver.Phanto ...ORACLE删除当前用户下所有的表的方法1.如果有删除用户的权限,则可以: drop user user_name cascade; 加…

linux物理内存地址与iomem,一种Linux系统物理内存镜像文件分析方法_4

模块信息,如图7所示,给出了本发明的实施例中 模块结构关系图,modules变量指向某一个已加载模块结构体module地址,所有已加载模 块其module形成一个双向链表,如图7所示,据此可以获取到所有已加载模块。[0099…

linux设备分层优点,Linux设备驱动的分层设计思想

代码清单8第2行获取platform_data,而platform_data实际上是定义GPIO按键硬件信息的数组,第31行的for循环工具这些信息申请GPIO并初始化中断,对于LDD6140电路板而言,这些信息如代码清单10。代码清单10 LDD6410开发板GPIO按键的plat…

linux 关闭桌面环境,Ubuntu 14.04上的Cinnamon桌面环境PPA被关闭

今天Cinnamon桌面环境的开发者宣布关闭Cinnamon桌面环境的PPA,这意味着以后在Ubuntu上安装Cinnamon桌面环境将变得很难。关于为什么要关闭PPA,Cinnamon PPA的维护者Gwendal Le Bihan做出了以下解释:“稳定的Cinnamon PPA将不再提供&#xff0…

linux sd卡读写出错,linux系统SD卡读写问题

请教有过linux系统SD卡读写经验的前辈。我的项目是对FPGA上的SD卡部分做测试,在测试过程中发现在对SD卡所有领域进行读写操作时1、bus width 选择1-bit的速度4-bit是差不多的,这与我预想的不同,想知道问题出在哪里?(理论上4bit 速度应该是1-…