线程有以下三种实现方式

1、使用内核线程方式实现,优点内核完成线程切换和操纵调度器进行调度,并且负责将线程任务映射到处理器上。程序一般不使用内核线程会使用一种轻量级进程,轻量级进程与内核线程一对一模型如下图。

由于内核线程支持,一个轻量级进程在系统调用中阻塞了,不会影响进程继续工作。但是轻量级进程基于内核线程实现,所以创建、析构、同步都需要进行系统调用,系统调用的代价太高需要在用户态和内核态切换来去。其次轻量级进程都需要一个内核线程的支持,因此轻量级进程需要消耗一定的内核资源,因此一个系统可以支持的轻量级进程是有限的。

2、用户线程实现

完全建立在用户空间的线程。用户线程的创建、消毁、同步、调度完全在用户态中完成,不需要在内核态完成。优点非常快速且低消耗,也可以支持规模更大的数量,缺点没有内核线程的支援创建、切换和调度都是需要考虑的问题。操作系统只把资源分配给了进程,阻塞如何处理、多处理器系统如何将线程映射到处理器上会异常困难,甚至不可能完成

3、用户级线程和轻量级线程混合实现

用户线程创建还是建立在用户空间,因此用户线程的创建、析构、切换等操作依然廉价,所以可以支持大规模并发。操作系统提供支持的轻量级进程则用作用户线程和内核间的桥梁。这样可以使用内核线程的调度和处理器映射功能,并且系统调用通过轻量进程实现,大大降低整个进程阻塞的风险。

java的线程实现方式

主要调度方式有两种协同式调度和抢占式调度。协同式调度自己控制切换,把自己事情干完再进行线程切换。如果一个线程有问题,一直不告诉系统线程切换,就会阻塞程序。抢占式调度,多个线程由系统来分配运行时间,线程本身不决定线程切换,Thread。yield可以让出执行时间。

状态切换

新建:创建后尚未启动的状态

运行:操作系统中的running和ready,就是这个线程可能是运行状态也可能是等待cpu分配运行时间

无限期等待:不会被cpu分配运行时间,要等到其他线程显示的唤醒。没有设置timeout的object.wait(),Thread.join(),LockSupport.park()

限期等待:不会被cpu分配运行时间,不需要其他线程显示的唤醒。有设置timeout的object.wait(),Thread.join(),LockSupport.parkNanos(),Thread.sleep(),LockSupport.parkUtil();

阻塞状态:阻塞和等待的区别是阻塞在等待一个排它锁,这个事件将在其他线程是否锁是产生。线程等待进入同步区域后会阻塞。

结束:已经终止的线程状态。

虚拟机实现java线程_深入理解java虚拟机(23):java与多线程相关推荐

  1. java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度

    一.前言 在java多线程编程中,volatile可以用来定义轻量级的共享变量,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度.所谓知己知彼.百战不殆.本文从JVM内 ...

  2. 深入jvm虚拟机第4版_深入理解JVM虚拟机

    自动内存管理机制 Java虚拟机原理 所谓虚拟机,就是一台虚拟的机器.他是一款软件,用来执行一系列虚拟计算指令,大体上虚拟机可以分为 系统虚拟机和程序虚拟机, 大名鼎鼎的Visual Box.Vmar ...

  3. java visualvm远程监控_深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  4. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  5. java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践

    本文转自: https://juejin.im/post/59e6c1f26fb9a0451c397a8c 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...

  6. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  7. java虚拟机的生命周期_深入理解Java虚拟机——JVM的生命周期

    package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Run ...

  8. java从内存角度理解类变量_深入理解volatile类型——从Java虚拟机内存模型角度...

    一.前言 在java多线程编程中,volatile可以用来定义轻量级的共享变量,它比synchronized的使用成本更低,因为它不会引起线程上下文的切换和调度.所谓知己知彼.百战不殆.本文从JVM内 ...

  9. 对Java线程概念的理解

    1.什么是线程 现代操作系统在运行一个程序时, 会为其创建一个进程. 例如, 启动一个Java程序, 操作系统就会创建一个Java进程. 现代操作系统调度的最小单元是线程, 也叫轻量级进程(Light ...

最新文章

  1. 2022-2028年中国TPE手套行业市场全景调查及发展策略分析报告
  2. CCTouchDispatcher sharedDispatcher 方法过期
  3. 前端见微知著工具篇:Bower组件管控
  4. 数值计算领域的“圣经”,图灵出了新版本 | 11月书讯
  5. nginx压力测试和并发预估
  6. javascript this 关键字学习
  7. 计算矢量面积_航天器轨道参数计算推导
  8. 线上防雪崩利器——熔断器设计原理与实现
  9. python学习实例(3)
  10. Linux如何避免每次开启 CentOS 时,都要手动开启 sshd 服务,防止连接不上Xshell
  11. 在.Net Core中使用Swagger制作接口文档
  12. php 纯数组,PHP 数组
  13. win10 android 手机驱动下载,win10手机刷机包驱动
  14. EPSON ME office 700FW打印机废墨收集垫已到使用寿命解决办法
  15. 重庆邮电大学801信号与系统考研最核心知识点
  16. nature 计算机论文,10分钟读懂6篇Nature/Science系列文章
  17. 解决360抢票王刷票0.1秒停顿问题,思考抢票软件和IT行业
  18. Japanese Student Championship 2021
  19. json几种不同解析方式
  20. 关于浮点运算和定点运算

热门文章

  1. java并发包下的lock接口与syschronized关键字的区别
  2. C# 值类型和引用类型
  3. 洛谷P1551 亲戚题解
  4. 学习总结 java 创建及其练习
  5. Android--Handler
  6. Unity3D中C#编写脚本
  7. 微软VC/MFC FAQ(转)
  8. [转载] python输入一个年份、输出是否为闰年_Python程序检查给定年份是否为闰年
  9. [转载] Python中numpy.clip();numpy.fabs()的用法;以及math.pow()的说明
  10. [转载] Python轻量Web框架Flask使用