Java|并发编程——Java线程的6种状态及切换


前言本次主要分享一下Java线程的六种状态及其转换 。
如果对于线程的创建方式不太了解 , 推荐观看并发编程——认识java里的线程
线程的状态及其转换
操作系统线程的五种状态
- 新建(NEW)
- 就绪(RUNNABLE)
- 运行(RUNNING)
- 阻塞(BLOCKED)
- 死亡(DEAD)
注意:BLOCKED状态 , 包括三种类型状态:等待(wait)、睡眠(sleep)、阻塞(申请资源:I\\O、对象的锁);
依据来源于Thread中的源码中有线程状态的一个枚举类 , 目前只有六种 。
Java线程的六种状态
- 新建(NEW)
- 可运行(RUNNABLE)
- 阻塞(BLOCKED)
- 等待(WAITING)
- 超时等待(TIMED_WAITING)
- 终止(TERMINATED)
注意:Java线程中的可运行状态(RUNNABLE)相当于操作系统线程状态中的就绪状态(RUNNABLE)和运行状态(RUNNING)
Java线程的状态图
新建(NEW)当用new操作符创建一个新线程的时候 , 如new Thread(r)这个线程还没有开始运行 。 这意味着它的状态就是新建(NEW) 。 当一个线程处于新建状态时 , 程序还没有开始运行线程中的代码 。
可运行(RUNNABLE)一旦调用start方法 , 线程就处于可运行(RUNNABLE)状态 。 一个可运行的线程可能正处于运行 , 也可能没有运行 。 要由操作系统为线程提供具体的运行时间 。 (不过Java规范没有将正在运行作为一个单独状态 。 一个正在运行的线程仍然处于可运行状态 。 )
阻塞(BLOCKED)一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态 , 说白了就是一个线程获取一个内部的对象锁的时候这个锁对象被其他线程占用了 , 那么这个线程就会被阻塞 。 是一种锁阻塞 。
理解可运行状态
一旦一个线程开始运行 , 它不一定始终保持运行 。 事实上 , 运行中的线程有时需要暂停 , 让其他线程有机会运行 。 线程调度的细节依赖于操作系统提供的服务 。 抢占式调度系统给每一个可运行线程一个时间片来执行任务 。 当时间片用完时 , 操作系统剥夺该线程的运行权 , 并给另外一个线程一个机会来运行 。 当选择下一个线程时 , 操作系统会考虑线程的优先级 。
现在所有的桌面以及服务器操作系统都使用抢占式调度 。 但是 , 像手机这样的小型设备可能使用协作式调度 。 在这样的设备中 , 一个线程只有在调度yield方法或者被阻塞或等待时才会失去控制权 。
在有多个处理器的机器上 , 每一处理器运行一个线程 , 可以有多个线程并行运行 。 当然 , 如果线程的数目多于处理器数目 , 调度器还是需要分配时间片 。
记住 , 在任何给定时刻 , 一个可运行的线程可能正在运行也可能没有运行(正是因为这样 , 这个状态称为“可运行”而不是“运行”) 。
等待(WAITING)一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态 , 例如我们调用Object.wait或者Thread.join这些就会出现这种情况 。
超时等待(TIMED_WAITING)处于这种状态的线程不会被分配CPU执行时间 , 不过无须无限期等待被其他线程显示地唤醒 , 在达到一定时间后它们会自动唤醒 。 一般像我们使用sleep(1000)方法 , 让线程睡一秒 , 过一秒之后线程就会自动唤醒继续执行 。
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- 编程|测试人员对编程天生“恐惧”么?
- Java|Gamamobi CEO黄继德:我们的元宇宙游戏不担心体验落差
- Java|美国传来新消息,ASML态度也变了,这一切竟如此之快
- Java|李佳琦消失扯下阿里“遮羞布”,原来淘宝根本就没有护城河
- Java|我做公众号终于不亏钱了
- 隔离|异步任务处理系统,如何解决业务长耗时、高并发难题?
- 编程|打造Web3.0基础设施 百度瞄准元宇宙的“人货场”?
