线程的六种状态转换
时间:2022-07-27
本文章向大家介绍线程的六种状态转换,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
线程的六种状态
同一时间线程只能处于一种状态
-
New
新创建 -
Runnable
可运行 -
Blocked
被阻塞 -
Waiting
等待 -
Timed Waiting
计时等待 -
Terminated
被终止
获取当前线程状态
可以使用线程的getState()
获取当前线程的状态
Thread thread = new Thread();
System.out.println(thread.getState());
新建状态(New)
New
的意思是当前线程新建出来但没有启动,比如新建一个线程时new Thread()
,此时线程就处于New
状态,如果线程调用的了start()
方法,此时线程开始执行run()
下面的方法,这时候线程的状态也就会从New
变成Runnable
状态。
可运行状态(Runnable)
在Java中,Runnable
状态分为两种,一种是可能没有运行,正在等待CPU调度资源分配给线程使用,另外一种是已经正在运行。假设A线程正在执行,跑到一半分配的CPU资源被调度走做了别的事情,那么此时该线程会暂时不运行,等待重新分配CPU资源,这个时候线程的状态还是RUnnable
状态不会做出改变。
阻塞状态(Blocked)
线程从RUnnable
状态变成Blocked
状态只有一种途径,就是当线程进入到synchronized
没有拿到当前代码块对应的monitor
锁,这个时候线程就会进入到Blocked
状态。
等待状态(Waiting)
线程从Runnable
进入Waiting
有以下三种情况:
- 线程调用了没有设置
Timeout
参数的Object.wait()
方法。 - 线程调用了没有设置
Timeout
参数的Thread.join()
方法。 - 线程调用了
LockSupport.park()
方法。
Blocked
状态是针对synchronized
的monitor
锁的,但是java中有很多种锁,例如:ReentrantLock
。在这些锁中,如果线程没有获取到锁,就会直接进去Waiting
状态,其实本质就是调用了LockSupport.park()
,进入到Waiting
状态。
Blocked 和 Waiting 区别:
-
Blocked
等待其它线程释放monitor
锁。 -
Waiting
是等待其它条件,例如join()
执行结束,或者是notify()
和notifyAll()
。
计时等待(Timed Waiting)
与
Waiting
是一样的。
线程进入到Timed Waiting
状态有以下四种情况:
- 线程调用了设置时间参数的
Thread.sleep(long millis)
方法。 - 线程调用了设置时间参数的
Object.wait(long timeout)
方法。 - 线程调用了设置时间参数的
Thread.join(long millis)
方法。 - 线程调用了设置时间参数的
LockSupport.parkNanos(long nanos)
和LockSupport.parkUntil(long deadline)
方法。
线程终止(Terminated)
线程进入到Terminated
有两种情况:
-
run()
方法中代码执行完毕,正常退出。 - 出现没有捕获的异常,终止的
run()
方法,意外退出。
流程图
图片原文:传送门
原文发布在:传送门
- 非常强悍并实用的双机热备+负载均衡线上方案
- Apache 压力测试工具ab
- SQL之收集SQL Server线程等待信息
- 聚合索引(clustered index) / 非聚合索引(nonclustered index)
- 域名资讯:单词域名can.com以15.5万美金成功交易
- jQuery无缝图片横向(水平)/竖向(垂直)滚动
- Centos下MooseFS(MFS)分布式存储共享环境部署记录
- MFS+Keepalived双机高可用热备方案操作记录
- Docker容器学习梳理-容器时间跟宿主机时间同步
- AS1.0(2.0)中的XML示例
- kvm虚拟机日常操作命令梳理
- mongodb 总结
- 关于微信小程序内置组件swiper,circular使用分享
- zabbix问题记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【教程】checkra1n越狱教程+常用插件推荐
- 【教程】抓取网页内视频的五种方法
- 了解 Anaconda
- 【实用】教你识别下载“全家桶”
- 【iOS】修改checkra1n+chimera环境(chimera1n)
- 在 istio 中限制 namespace 访问外部资源
- 【iOS】浅析近期越狱工具+“平刷”工具
- XGBoost Operator源码分析
- 【杂货】制作checkra1n启动盘思路
- 【iOS】chimera13指日可待,libhooker基板独立啦
- 类加载器之URLClassLoader
- 【iOS】较全的合并flex补丁教程
- R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
- spring代理对象都是代理对象吗
- R语言Markowitz马克维茨投资组合理论分析和可视化