首页 > 其他分享 >一个例子彻底搞懂对线程模型的理解 !

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

时间:2024-09-10 10:50:53浏览次数:3  
标签:Java 操作系统 例子 线程 内核 JVM 工人 搞懂

如何理解一对一线程模型

假设你的计算机是一个大工厂,操作系统(如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都是一对一线程模型,不存在多对一和多对多线程模型。

标签:Java,操作系统,例子,线程,内核,JVM,工人,搞懂
From: https://blog.csdn.net/weixin_42627385/article/details/142074073

相关文章

  • Spring Cloud全解析:熔断之Hystrix线程隔离导致的问题
    Hystrix线程隔离在微服务框架中,可能一个服务需要调用多个微服务,在tomcat中运行时,tomcat只是分配了100个线程,由于多个服务之间调用的时间消耗过长,可能会导致线程耗尽,而在Hystrix中存在线程隔离,对于每个微服务分配一个线程池,访问某个微服务时就从对应的线程池中取线程,如果对应线程......
  • 使用 Parallel 类进行多线程编码(下)
    2.Parallel.ForEach()的使用 从ForEach()这个名字可以看出该方法是用来遍历泛型集合的,新建一个ASP.NETCore Web应用的项目,如下:         在Index.cshtml.cs文件中增加一个UserInfo.cs的类,代码如下:publicclassUserInfo{publicint......
  • Numba最近邻插值(CPU+ GPU + Z轴切块 + XYZ轴切块 + 多线程)
    文章目录最近邻插值(加速方法)(1)scipy.ndimage.zoom(2)Numba-CPU加速(3)Numba-GPU加速(4)Numba-CPU加速(Z轴切块)(5)Numba-CPU加速(XYZ轴切块)(6)Numba-CPU加速(XYZ轴切块)+多线程输入数据插值倍数时耗scipy.ndimage.zoom(1024,1024,512)4172.16sNumba-CPU(1024,1024,512)456.58sN......
  • 二、并发编程与多线程-2.2、多线程(中)
    2.2、多线程(中)2.2.4、为什么启动线程不能直接调用run()方法?调用两次start()方法会有什么后果?答:在Java中,启动线程不能直接调用run()方法的原因是,run()方法是线程的执行体,通过调用start()方法来启动线程可以创建一个新的线程并使其运行。如果直接调用run()方法,则会在当前线......
  • java基础 -线程(基础)的 笔记
     581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识。   根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不能表示当前进程死亡了,只有当所有的子线程执行完了,主进程才会结束。 真正......
  • Runnable 接口是如何“新建”线程的
    Runnable接口是Java中用于创建线程的基础接口之一,它定义了一个无参无返回的方法run(),而在我们的认知中,其是创建线程的方法之一,使得对象可以在线程中执行,而无需继承Thread类。一、Runnable接口如何“新建”线程事实上,这个所谓的“新建”只是一个通俗的叫法,就Java而言,代表线......
  • 面试官:如何实现线程池任务编排?
    任务编排(TaskOrchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行。1.为什么需要任务编排?在复杂的业务场景中,任务间通常存在依赖关系,也就是某个任务会依赖另一个任务的执行结果,在这种情况下,我们需要通过任务编排,来确保任务按照正确的顺序进行执行。......
  • python中的线程锁的了解与学习
    文章目录前言一、python为什么会有GIL?二、GIL和线程锁有什么联系三、线程安全与锁3.1线程安全3.2Lock(一次放生一个)3.3RLock(一次放生一个)3.4BoundedSemaphore(一次放生定值个)3.5Condition(一次放生任意个,可变化)3.6Event(一次放生所有)四、总结前言       ......
  • python中的线程池的了解与学习
    文章目录前言一、线程池的使用二、线程池的工作流程三、线程池的优势四、总结前言       线程池是计算机编程中用于管理一组预先创建的线程的机制,这些线程可以被复用以执行多个任务。线程池的主要目的是提高程序的效率和响应性,通过减少线程创建和销毁的开销,......
  • 0号线程swapper
    【Linux内核|进程管理】0号线程swapper简介 12人赞同了该文章​目录收起0.说明1.总览2.汇编阶段的初始化3.init_task结构体4.bootcpu0号线程的工作4.1.start_kernel4.2.其他cpu的0号线程创建4.3.......