当前位置: 首页 > news >正文

一个例子彻底搞懂对线程模型的理解 !

如何理解一对一线程模型

假设你的计算机是一个大工厂,操作系统(如Windows或Linux)是工厂的管理系统,而Java虚拟机(JVM)是工厂里的一个部门。这些部门里有很多工人(线程),每个工人可以负责一项具体的任务(比如处理一个计算或者操作某个数据)。

在Java中,每当你创建一个线程时,JVM就会告诉操作系统:“我需要一个新的工人来帮我完成这个任务。” 操作系统听到这个请求后,就会分配一个操作系统级别的工人(内核线程)来完成这个任务。所以,每一个Java线程都直接对应一个操作系统的内核线程,这是“一对一线程模型”的基本概念。

举个例子,假设你正在开发一个下载管理器应用程序,这个应用程序需要同时下载多个文件。为了让下载任务并行处理,你决定为每个文件创建一个线程。

  1. 创建Java线程:你用Java代码创建了三个线程来下载三个文件。

    • 线程1:负责下载文件A。
    • 线程2:负责下载文件B。
    • 线程3:负责下载文件C。
  2. JVM与操作系统交互:

    • JVM会为这三个Java线程分别请求操作系统分配三个内核线程。操作系统会在自己的资源池中分配三个真正的工人(内核线程)来处理这些任务。
    • 于是,Java线程1映射到了操作系统的内核线程1,Java线程2映射到了操作系统的内核线程2,Java线程3映射到了操作系统的内核线程3。
  3. 并行执行任务:

    • 现在,三个内核线程并行运行,每个线程负责下载一个文件。操作系统会调度这些内核线程在CPU上执行,确保每个文件的下载任务都能得到处理。

如何理解多对一线程模型

多对一线程模型是指多个用户线程映射到一个操作系统内核线程。换句话说,多个“虚拟”工人(用户线程)由一个“真正”的工人(内核线程)来处理。

想象一下,工厂的管理层(操作系统)不允许JVM部门(Java虚拟机)直接雇佣多个工人(内核线程),而是规定:“你们部门的所有工作只能由一个人完成。” JVM部门为了多做一些事情,只能创建很多虚拟工人(用户线程),然后这些虚拟工人排队,由一个真正的工人(操作系统内核线程)来轮流完成所有的任务。

如何理解多对多线程模型

多对多线程模型是指多个用户线程映射到多个操作系统内核线程。JVM可以创建多个用户线程,并且操作系统为这些用户线程分配一部分内核线程来执行任务。

在这个模型中,工厂管理系统(操作系统)允许JVM部门(Java虚拟机)创建多个工人(用户线程),但管理系统不需要为每个虚拟工人分配一个真正的工人(内核线程)。相反,管理系统会分配一部分真正的工人(内核线程),这些工人可以在不同的时间段内完成多个虚拟工人的工作。

注意:这里只是拿JVM举例来帮助我们理解这几种线程模型概念,实际上JVM都是一对一线程模型,不存在多对一和多对多线程模型。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Puppeteer】‘left‘ is already pressed, ‘${button}‘ is already pressed 的解决办法
  • Qt常用控件——QRadioButton和QCheckBox
  • 【VSCode v1.93.0】手动配置远程remote-ssh
  • 开源可视化大屏superset Docker环境部署
  • 计算机网络练级第一级————认识网络
  • VSTO常见的异常
  • 【自然语言处理】实验一:基于NLP工具的中文分词
  • 7.1图像平移
  • 安科瑞Acrel-1000DP分布式光伏监控系统平台的设计与应用-安科瑞 蒋静
  • 哈希表、算法
  • jupyter notebook详细介绍-学习篇
  • 网络编程(UDP)
  • 云原生周刊:OpenTofu Registry 获得用户界面和 API|2024.9.9
  • 【C语言】揭开计数制的面纱:深入浅出二进制及二进制计算
  • JavaEE 第23节 TCP的流量控制与阻塞控制详解
  • SegmentFault for Android 3.0 发布
  • .pyc 想到的一些问题
  • [Vue CLI 3] 配置解析之 css.extract
  • 【mysql】环境安装、服务启动、密码设置
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • JavaScript设计模式之工厂模式
  • k8s 面向应用开发者的基础命令
  • Nodejs和JavaWeb协助开发
  • tensorflow学习笔记3——MNIST应用篇
  • ViewService——一种保证客户端与服务端同步的方法
  • Vue--数据传输
  • webpack+react项目初体验——记录我的webpack环境配置
  • web标准化(下)
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 力扣(LeetCode)357
  • 聊聊flink的TableFactory
  • 微信小程序:实现悬浮返回和分享按钮
  • 我的面试准备过程--容器(更新中)
  • 1.Ext JS 建立web开发工程
  • ​批处理文件中的errorlevel用法
  • ‌JavaScript 数据类型转换
  • "无招胜有招"nbsp;史上最全的互…
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Linux(make工具和makefile文件以及makefile语法)
  • #Linux(Source Insight安装及工程建立)
  • (LeetCode C++)盛最多水的容器
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (十八)SpringBoot之发送QQ邮件
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十一)手动添加用户和文件的特殊权限
  • (转)Mysql的优化设置
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net IOC框架入门之一 Unity
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET中两种OCR方式对比