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()的通常是为了同步,也就是说多个线程之间配合工作,大家按照某个顺序或者一定的条件来运行。典型模型如消费者生产者。
而锁是为了互斥。
java线程和操作系统线程的异同(大图对比)的更多相关文章
- 浅谈java中线程和操作系统线程
在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就 ...
- 【转】java jvm 线程 与操作系统线程
原文链接:http://segmentfault.com/q/1010000000370403 Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故 ...
- Java 线程和操作系统的线程有啥区别?
尽人事,听天命.博主东南大学硕士在读,携程 Java 后台开发暑期实习生,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收 ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- java线程 - 多线程 - 守护线程
1.多线程执行者/处理类 都是Runnable的实现类(如自定义类实现Runnable 或 java原生的Thread.FutureTask),但最后都必须封装成Thread线程类由Thread.st ...
- Java多线程编程核心技术---线程间通信(一)
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...
- Java中的守护线程和非守护线程(转载)
<什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...
- java中进程与线程的三种实现方式
一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程是指 ...
- java学习之路---线程(重点)
1.多线程是一种并发机制的有效手段.进程和线程一样,都是实现并发的一个基本单位.线程是比进程更小的一种实现单位,线程是在进程的基础上的进一步划分.所谓的多线就是在一个进程中产生了多个线程,这些线程可 ...
随机推荐
- apache-tomcat-7.0.92
链接:https://pan.baidu.com/s/1wnTSjTknYfaeDV_pakrC9g 提取码:see7
- Redis6.x学习笔记(二)持久化之RDB
前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...
- 如何安装Eigen库和Sophus库
* { font-family: "Tibetan Machine Uni", "sans-serif", STFangSong; outline: none ...
- 常用的 TCP KeepAlive 参数
转自:http://dola.xinfan.org/?p=359 我们知道 TCP 协议有检测连接状态的机制,当连接不活跃的时候,连接双方会通过一定的算法检测连接是否正常.这个机制就是 TCP 的 K ...
- 软负载Nginx和硬负载F5的优缺点对比
对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的一个转发器. a.软件负载均衡解决方案 在一台服务器的操作系统上,安装一个附加软件 ...
- 技能Get·Windows10将任何格式文件固定到开始屏幕
阅文时长 | 0.6分钟 字数统计 | 960.8字符 主要内容 | 1.引言&背景 2.将文件加入到应用列表中 3.修改注册表法 4.声明与参考资料 『技能Get·Windows10将任何格 ...
- java基础——简易计算器的实现
计算器: import java.util.Scanner;public class CalculateDemo { public static void main(String[] args ...
- Linux VMware Tools详解
VMware Tools描述 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机系统进行无缝交互. 在Lin ...
- TrueCrypt与CryptSetup双系统全盘加密(图文)
http://blog.topsec.com.cn/truecrypt%E4%B8%8Ecryptsetup%E5%8F%8C%E7%B3%BB%E7%BB%9F%E5%85%A8%E7%9B%98% ...
- Java public 和 private 访问修饰符
何为封装 从事面向对象编程的 Java 程序员,不可能不知道封装,它是面向对象编程的精髓,非常重要. 那什么是封装?字面意思就是把摆在外面的东西包起来. 一句话,封装就是对外隐藏内部细节. 那为何要封 ...