【Java多线程】多线程与CPU、内存和I/O

本文详细介绍了Java多线程的概念,包括线程如何利用CPU、内存和I/O资源。讨论了单核和多核CPU的工作原理,强调了时间分片和超线程技术。此外,文章还探讨了Java内存模型中的主内存和工作内存,并解释了I/O的特点,特别是其单线程服务和长时间占用的特点。最后,文章区分了CPU密集型和IO密集型任务,阐述了多线程在不同场景下的效率优势。
摘要由CSDN通过智能技术生成
线程

描述: 线程是进程的进一步划分,是操作系统系统能够进行运算高度的最小单元。一个进程通常包含多个线程。其中,必有一个主线程

  1. 一个线程的执行,通常需要三个资源,即CPU,内存和I/O。CPU负责运行,内存负责存放即时数据,I/O负责和磁盘、数据库、网络等做数据交换

  2. 在单核CPU的情况下,单位时间里,CPU只能处理一个线程。那么,CPU怎么实现多线程呢?

    1. CPU采用了时间分片的方式。CPU将一段时间分成若干段,每段执行一个线程(当然,也可能若干段都执行同一线程),由于计算机的执行速度是非常快的,所以,对用户来说,即使是单CPU,也具备同时执行多个线程的能力(事实上并不同时,只是粗粒度感觉上的同时)。
  3. 多核CPU的情况下,每个CPU核的处理情况和单核CPU的处理相同,唯一不同的是,单位时间里,可以执行多个线程。

物理CPU和逻辑CPU

描述: 物理CPU就是一个物理元件,其个数指的就是计算机实际配置的CPU个数

  1. 早先时间,一个物理CPU只有一个核,多核技术发展以后,效果就像是在一个物理CPU上集中了多个CPU核心。

  2. 再之后,又有了超线程的概念,即通过技术手段,可以使的一个CPU核心支持多线程(一般是双线程),这种多线程和前面提到的时间分片不同,它是真正意义上的单位时间的多线程。以双线程为例,超线程技术就像是使我们的CPU数量又翻了一倍。

  3. 也就是说,逻辑CPU的数量,和系统单位时间内可执行的线程数量是相同的。如: 两路双核四线程CPU,实际上有2 * 2 * 4 = 16 个逻辑CPU。

所谓的两路cpu就是指 主板上面有2个CPU插座,可以插2个cpu,四路也是这个道理,我的电脑是属于一路cpu

  • 两路双核四线程CPU,即主板上面有2个CPU插座,可以插2个cpu,四核是每个cpu有4个核心,然后使用超线程技术,让一个处理器通过技术手段模拟成两个处理器,就是 224=16个逻辑处理
    在这里插入图片描述
    在这里插入图片描述
内存

在这里插入图片描述
在聊内存时,我们限定到JAVA,也就是说,我们聊的是JAVA内存模型。因为内存物理意义上来说,是计算机提供的一块存储介质,它拥有相对来说更高的读写速度。但是,不同的语言或程序,对内存的使用策略是不同的,所以,只有限定到某种语言或某个程序上,来聊内存管理,才是有意义的。

  1. Java内存模型将内存分为了主内存和工作内存。
  2. 类的状态,也就是类之间共享的变量,是存储在主内存中的。
  3. 每个线程都有自己的一个工作内存。工作内存相当于一个高级缓冲,每次Java线程要用到主内存中的某个变量时,会先将主内存中的变量,拷贝到工作内存,当执行操作代码时,实际上操作的是自己工作内存中的拷贝。当线程代码执行完毕之后,再将变量最新的值更新到主内存中。
I/O

描述: I/O,即输入/输出。

  1. Java中,常见的I/O,如文件流数据库连接网络连接等。

  2. I/O的特点是每个连接单位时间内只能为一个线程服务,它不像单核CPU那样,可以通过时间切片的方式,执行多线程。它只能为单一线程服务。

  3. 还有一个特点是,当一个线程在使用I/O时,一般耗时相对较长,且在这个时间段内,线程不进行计算或读写内存,换言之,线程在使用I/O时,一般不会使用CPU或内存。这个特点很重要,这其实是多线程的重要意义之一。在一个线程使用I/O时,将CPU使用权转移给其它线程,可以更加充分的利用系统资源。

番外篇(CPU密集型&IO密集型)
CPU密集型

描述: CPU密集型会消耗掉大量的CPU资源,例如需要大量的计算,视频渲染啊,仿真啊之类的。这个时候CPU就卯足了劲在运行,这个时候切换线程,反而浪费了切换的时间,效率不高。

就像你的大脑是CPU,你本来就在一本心思地写作业,多线程这时候就是要你写会作业,然后立刻敲一会代码,然后在P个图,然后在看个视频,然后再切换回作业。emmmm,过程中你还需要切换(收起来作业,拿出电脑,打开VS…)那你的作业怕是要写到挂科。。。这个时候不太适合使用多线程,你就该一门心思地写作业~

IO密集型

描述: 涉及到网络、磁盘IO的都是IO密集型,这个时候CPU利用率并不高,这个时候适合使用多线程

同样以你的大脑为例,IO密集型就是“不烧脑”的工作。例如你需要陪小姐姐或者小哥哥聊天,还需要下载一个VS,还需要看我(黑哥)的博客。这个时候如果使用多线程的话会怎么做?

咦?小哥哥(小姐姐)给你发消息了,回一下TA,然后呢?TA给你回消息肯定需要时间,这个时候你就可以搜索VS的网站,先下安装包,然后一看,哎呦,TA还没给你回消息,然后看会你黑哥的博客。小哥哥(小姐姐)终于回你了,你回一下TA,接着看我的博客,这就是类似于IO密集型。你可以在不同的“不烧脑”的工作之间切换,来达到更高的效率。而不是小姐姐不回我的信息,我就干等,啥都不干,就等,这个效率可想而知,也许,小姐姐(小哥哥)根本就不会回复你~

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墩墩分墩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值