当前位置: 首页 > news >正文

线程有几种状态,状态之间的流转是怎样的?

Java中线程的状态分为6种:

1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。

2.运行(RUNNABLE):Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行”。

就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权 。

运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,开始执行程序代码。

3.阻塞(BLOCKED):表示线程阻塞于锁(关于锁,在后面章节会介绍)。

4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。

6. 终止(TERMINATED):表示该线程已经执行完毕。

状态流转如图:

拓展知识

WAITING和TIMED_WAIT的区别?

WAITING是等待状态,在Java中,调用wait方法时,线程会进入到WAITING状态,而TIMED_WAITING是超时等待状态,当线程执行sleep方法时,线程会进入TIMED_WAIT状态。

处于WAITING和TIMED_WAIT的线程,都是会让出CPU的,这时候其他线程就可以获得CPU时间片开始执行。但是他们在对象的锁释放上面并不一样,如果加了锁,sleep方法不会释放对象上的锁,而wait方法是会释放锁的。

因为Java锁的目标是对象,所以wait、notify和notifyAll针对的目标都是对象,所以把他们定义在Object类中。而sleep不需要释放锁,所以他是Thread类中的一个方法。

为什么线程没有RUNNING状态

对于现在的分时操作系统来说,在单CPU情况下,所有的线程其实都是串行执行的。但是为了让我们看起来像是在并发执行,人们把CPU的执行分成很多个小的时间片。

哪个线程得到时间片,那个线程就执行,时间片到了之后,就要释放出CPU,再重新进行争抢时间片。

只要把时间片划分的足够细,那么多个程序虽然在不断的串行执行,但是看起来也像是在同时执行一样。

 

那么,CPU的时间片其实是很短的,一般也就是10-20毫秒左右。

那么,也就是说,在一秒钟之内,同一个线程可能一部分时间处于READY状态、一部分时间处于RUNNING状态。

那么如果,明确的给线程定义出RUNNING状态的话,有一个很大的问题,就是这个状态其实是不准的。

因为当我们看到线程是RUNNING状态的时候,很有可能他已经丢失了CPU时间片了。

对于线程的状态,我们只需要知道,他当前有没有在"正在参与执行"就行了,何为"参与执行"?

就是他的状态是可执行的,只要获得时间片,就能立即执行。

那这不就是RUNNABLE吗?

所以,Java就没有给线程定义RUNNING状态,而是定义了一个RUNNABLE状态。

相关文章:

  • 万用表数据导出变化曲线图——pycharm实现视频数据导出变化曲线图
  • 多种方法求解数组排序
  • 每日OJ题_牛客CM26 二进制插入
  • FPGA的时钟资源
  • VMware下载与安装
  • Python 初步了解urllib库:网络请求的利器
  • 问题:前端获取long型数值精度丢失,后面几位都为0
  • Synthetic Temporal Anomaly Guided End-to-End Video Anomaly Detection 论文阅读
  • STM32---通用定时器(一)理论基础
  • 【亲测有效】解决三月八号ChatGPT 发消息无响应!
  • 【vue2基础教程】vue指令
  • 深入理解 Webpack 热更新原理:提升开发效率的关键
  • 新概念英语第二册(73)
  • T1 小美的数组询问(15分) - 美团编程题 题解
  • DHCP中继实验(华为)
  • 《Java编程思想》读书笔记-对象导论
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular 2 DI - IoC DI - 1
  • Angular 4.x 动态创建组件
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Angular 响应式表单 基础例子
  • co.js - 让异步代码同步化
  • Intervention/image 图片处理扩展包的安装和使用
  • jquery cookie
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 开发基于以太坊智能合约的DApp
  • 排序算法学习笔记
  • 使用agvtool更改app version/build
  • 思否第一天
  • 移动端唤起键盘时取消position:fixed定位
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ionic入门之数据绑定显示-1
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 移动端高清、多屏适配方案
  • ​2020 年大前端技术趋势解读
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • $.proxy和$.extend
  • (007)XHTML文档之标题——h1~h6
  • (175)FPGA门控时钟技术
  • (2)nginx 安装、启停
  • (20050108)又读《平凡的世界》
  • (差分)胡桃爱原石
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (四)linux文件内容查看
  • (转)http协议
  • (转)树状数组
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .gitignore文件_Git:.gitignore
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作