java线程和操作系统线程的异同(大图对比)
先看看两者的对比:
可以发现:
1.java中细分了阻塞,将阻塞给分成了三个不同类型的阻塞。
2.java没有区分就绪状态和运行状态。java将这两种状态合并成runnable状态。
3.还有一个容易被忽略的点:java中的IO阻塞,在java中的线程状态实际上是runnable。
jvm没有做实际的线程调度,而是交给操作系统来完成。java只是对操作系统中的线程模型做了一个包装。
就绪状态:
java与操作系统的状态对应如图所示:
对于运行和就绪状态的合并:
一种解释是:在实际使用中,运行和就绪状态的切换是很快的,在对于线程监控上我们几乎不能察觉到两者的区别,于是合并成了一个。
但该说法无法解释将为什么将IO阻塞也囊括进runnable状态。
对于等待资源的状态:
jvm认为,等待资源的线程处于就绪状态,等待cpu和等待IO都被认为是就绪状态。
而在操作系统中,只有等待cpu运行权的才属于就绪状态。
阻塞状态
因为不能获取到锁(synchronized),而进入的阻塞状态,在java中对应blocked。
线程使用wait()和join()等,主动陷入阻塞状态,则为waiting状态。
wait状态具体又分为了waiting和timed waiting。
简单区分一下两者使用的场合:
我们使用wait()的通常是为了同步,也就是说多个线程之间配合工作,大家按照某个顺序或者一定的条件来运行。典型模型如消费者生产者。
而锁是为了互斥。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~