码迷,mamicode.com
首页 > 编程语言 > 详细

java线程和操作系统线程的异同(大图对比)

时间:2021-06-20 18:21:02      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:操作   图片   java   src   strong   cpu   ima   lazy   而在   

先看看两者的对比:

技术图片

 

可以发现:

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

而锁是为了互斥。

java线程和操作系统线程的异同(大图对比)

标签:操作   图片   java   src   strong   cpu   ima   lazy   而在   

原文地址:https://www.cnblogs.com/tchj/p/14906653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!