先看看两者的对比:

可以发现:

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线程和操作系统线程的异同(大图对比)的更多相关文章

  1. 浅谈java中线程和操作系统线程

    在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就 ...

  2. 【转】java jvm 线程 与操作系统线程

    原文链接:http://segmentfault.com/q/1010000000370403 Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故 ...

  3. Java 线程和操作系统的线程有啥区别?

    尽人事,听天命.博主东南大学硕士在读,携程 Java 后台开发暑期实习生,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收 ...

  4. 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal

    什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...

  5. java线程 - 多线程 - 守护线程

    1.多线程执行者/处理类 都是Runnable的实现类(如自定义类实现Runnable 或 java原生的Thread.FutureTask),但最后都必须封装成Thread线程类由Thread.st ...

  6. Java多线程编程核心技术---线程间通信(一)

    线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...

  7. Java中的守护线程和非守护线程(转载)

    <什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...

  8. java中进程与线程的三种实现方式

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程. 进程:进程是指 ...

  9. java学习之路---线程(重点)

     1.多线程是一种并发机制的有效手段.进程和线程一样,都是实现并发的一个基本单位.线程是比进程更小的一种实现单位,线程是在进程的基础上的进一步划分.所谓的多线就是在一个进程中产生了多个线程,这些线程可 ...

随机推荐

  1. Could not contact [localhost:8005]. Tomcat may not be running.

    出错环境介绍: Tomcat-version:8.5.56 JDK-version:1.8.0_152 Linux:CentOS-7 错误信息 sh /opt/apache-tomcat-8.5.56 ...

  2. 获取汉字首字母并分组排列 PHP

    1.代码class Character{ /** * 数组根据首首字母排序 */ /** * 二维数组根据首字母分组排序 * @param array $data 二维数组 * @param stri ...

  3. $ git push -u origin master 报错

    输入$ git push -u origin master报permission denied(publickey) 如下: 原因是没有与gitee上的账号成功建立密钥对,所以需要配对密钥 解决方法( ...

  4. Asp.NetCore 自定义中间件

    这节演示一下自定义中间件,第一节我们讲到,中间件的处理流程就像一个俄罗斯套娃,那这种俄罗斯套娃型的流程内部是如何实现的呢,下面请看代码​. ​第一种写法是直接写在Configure方法中的,使用app ...

  5. 从几道题目带你深入理解Event Loop_宏队列_微队列

    目录 深入探究JavaScript的Event Loop Event Loop的结构 回调队列(callbacks queue)的分类 Event Loop的执行顺序 通过题目来深入 深入探究Java ...

  6. 交叉编译参数--build、host和target的区别

    build.host和target 在交叉编译中比较 常见 的一些参数就是build.host和target了,正确的理解这三者的含义对于交叉编译是非常重要的,下面就此进行解释 --build=编译该 ...

  7. 1.HTML入门

    1.1 初识HTML 1.1.1 概述 网络世界已经跟我们息息相关,当我们打开一个网站,首先映入眼帘的就是一个个华丽多彩的网页.这些网页,不仅呈现着基本的内容,还具备优雅的布局和丰富的动态效果,这一切 ...

  8. 13.API基础

    1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...

  9. Linux创建RAID10_实战

    Linux创建RAID10_实战 Linux创建RAID10 RAID10 是先将数据进行镜像操作,然后再对数据进行分组,RAID1 在这里就是一个冗余的备份阵列,而RAID0则负责数据的读写阵列 至 ...

  10. 040.Python进程和Join

    一  进程相关介绍 1.1 进程的概念(process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位 资源分配:分配的是cpu和内存等物理资源 进程号是程的唯标识 同-个程序执行两次之 ...