java线程和操作系统线程的异同(大图对比)
2024-08-28 08:51:20
先看看两者的对比:
可以发现:
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()的通常是为了同步,也就是说多个线程之间配合工作,大家按照某个顺序或者一定的条件来运行。典型模型如消费者生产者。
而锁是为了互斥。
最新文章
- 无废话WCF入门教程六[一个简单的Demo]
- 将页面上的内容导出到Excel
- NRF51822之IIC(MEMS_LIS2DH12)
- 编写 Unity Editor 插件
- 洛谷P1209 [USACO1.3]修理牛棚 Barn Repair
- MyBatis复习
- backbone.Collection源码笔记
- java.sql.SQLException: ORA-00911: 无效字符 解决方案
- 借助OpenOffice实现office转pdf(Java)的.exe小程序
- 每天一个linux命令(37)--iostat命令
- kali权限提升之配置不当提权与WCE
- Java开发笔记(五十八)简单接口及其实现
- golang time打印出的值是62135596800的来源
- Go常量与运算符
- java十年,需要学会的Java开发体系
- PHP CURL POST提交
- nginx 总结
- css-使不同大小的图片在固定大小的容器中居中
- HDU4513:完美队形II(Manacher)
- java 工作流项目源码 SSM 框架 Activiti-master springmvc 有手机端功能