线程的六种状态转换
时间: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()
方法,意外退出。
流程图
图片原文:传送门
原文发布在:传送门
- ASP.NET BBcode
- JavaScript 常用算法
- SVG 使用
- 小程能走网店模式?如何做分销模式的小程序?
- IIS 6 下配置以 FastCGI 跑 PHP
- IIS 7.x Application Request Routing(ARR) 502错误的解决方法
- 移动前端头部标签(HTML5 meta)
- 这个行业在汽车圈最落后,正在被物联网和AI改变
- WordPress 网站基于REST API 开发“微信小程序”实战
- 摩拜共享汽车亮相 首批新能源电动汽车试运行
- 基于SQL Server 2008 Service Broker构建企业级消息系统
- Windows主机管理系统Websitepanel
- 自定义Appfabric Cache 配置提供程序
- 2017年发生在上海的科技大新闻
- 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 数组属性和方法
- Saltstack_使用指南07_远程执行-执行模块
- 学习从拥有一支好笔开始
- Saltstack_使用指南08_远程执行-返回程序
- 人生苦短,何不用vim装13
- Saltstack_使用指南09_远程执行-编写执行模块
- 如何安装FreeIPA
- 编译及使用hive-testbench生成Hive基准测试数据
- 树酱的前端知识体系构建(下)
- Babel配置傻傻看不懂?
- Saltstack_使用指南10_配置管理-状态模块
- Saltstack_使用指南11_配置管理-状态之间依赖关系 4.1. 部署架构4.2. Apache和PHP的SLS【正向依赖】4.3. mariadb 的 SLS
- 前端工程化之CICD那点破事
- Saltstack_使用指南12_配置管理-jinja模板 4.1. 部署架构4.2. 本章涉及的 pillar 的信息4.3. 配置文件 httpd.conf 修改
- Saltstack_使用指南13_runner的job和manage与execution的saltutil 5.1. master执行5.2. 查看当前活动的jobs
- Saltstack_使用指南14_无master 3.1. 常规信息3.2. grains设置3.3. pillar设置