线程状态
6态
New
:新建状态Runnable
:可运行状态Terminated
:终止状态Waiting
:等待状态TimedWaiting
:超时等待状态Blocked
:阻塞状态
7态
New
:新建状态Ready
:就绪状态Running
:运行状态Terminated
:终止状态Waiting
:等待状态TimedWaiting
:超时等待状态Blocked
:阻塞状态
新建状态(New)
可以通过实现Runnable
接口或继承Thread
声明一个线程类实现callable接口,new
一个实例后,线程就进入了新建状态。
就绪状态(Ready)
线程对象创建成功后,调用该线程的start()
函数,线程进入就绪状态,该状态的线程进入可运行线程池中,等待获取C P U
的使用权。
运行状态(Running)
此时线程调度程序正在从可运行线程池中选择一个线程,该线程进入运行状态。
换句话说,线程获取到了C P U
时间片。
当线程时间片用完或调用的yield()
函数,该线程回到就绪状态。
终止状态(Terminated)
线程继续运行,直到执行结束或执行过程中因异常意外终止都会使线程进入终止状态。线程一旦终止,就不能复生,这是不可逆的过程。
等待状态(Waiting)
运行状态的线程执行wait()、join()、LockSupport.park()任意函数,该线程进入等待状态。
其中wait()
与join()
函数会让J V M把该线程放入锁等待队列。
处于这种状态的线程不会被分配C P U执行时间,它们要等待被主动唤醒,否则会一直处于等待状态。
执行LockSupport.unpark(t)
函数唤醒指定线程,该线程回到就绪状态。
而通过notify()、notifyAll()、join线程执行完毕
方式,会唤醒锁等待队列的线程,出队的线程回到就绪状态。
超时等待状态(Timed waiting)
超时等待与等待状态一样,唯一的区别就是多了超时机制,不会一直等待被其他线程主动唤醒,而是到达指定时间后会自动唤醒。
以下函数会触发进入超时等待状态
- wait(long)
- join(long)
- LockSupport.parkNanos(long)
- LockSupport.parkUtil(long)
- sleep(long)
阻塞状态(Blocked)
运行状态的线程获取同步锁失败或发出I/O
请求,该线程进入阻塞状态。
如果是获取同步锁失败J V M
还会把该线程放入锁的同步队列。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战