先看看两者的对比:

可以发现:

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()的通常是为了同步,也就是说多个线程之间配合工作,大家按照某个顺序或者一定的条件来运行。典型模型如消费者生产者。

而锁是为了互斥。

最新文章

  1. 无废话WCF入门教程六[一个简单的Demo]
  2. 将页面上的内容导出到Excel
  3. NRF51822之IIC(MEMS_LIS2DH12)
  4. 编写 Unity Editor 插件
  5. 洛谷P1209 [USACO1.3]修理牛棚 Barn Repair
  6. MyBatis复习
  7. backbone.Collection源码笔记
  8. java.sql.SQLException: ORA-00911: 无效字符 解决方案
  9. 借助OpenOffice实现office转pdf(Java)的.exe小程序
  10. 每天一个linux命令(37)--iostat命令
  11. kali权限提升之配置不当提权与WCE
  12. Java开发笔记(五十八)简单接口及其实现
  13. golang time打印出的值是62135596800的来源
  14. Go常量与运算符
  15. java十年,需要学会的Java开发体系
  16. PHP CURL POST提交
  17. nginx 总结
  18. css-使不同大小的图片在固定大小的容器中居中
  19. HDU4513:完美队形II(Manacher)
  20. java 工作流项目源码 SSM 框架 Activiti-master springmvc 有手机端功能

热门文章

  1. Kafka源码分析系列-目录(收藏不迷路)
  2. 浅谈Java的诞生和现状
  3. 初窥软件工程 2020BUAA软件工程$\cdot$个人博客作业
  4. [MySQL数据库之数据库相关概念、MySQL下载安装、MySQL软件基本管理、SQL语句]
  5. CSS3文本样式
  6. 桌面支持qt版本是多少检查
  7. mysql 无法执行select查询
  8. 行业资讯 | Android WebView 致安卓应用闪退,mPaaS 助你规避这波 Bug
  9. 5分钟安装docker教程
  10. Pod无法删除 强制删除pod