为什么会出现线程?为什么会出现多线程?之前没有现成的时候是有什么弊端?

为什么会出现线程?为什么会出现多线程?之前没有现成的时候是有什么弊端?

计算机系统包括三个方面的大的东西
计算机系统包括三个方面的大的东西:

  • cpu。相当于我们人的大脑,人的大脑可以调度我们的身体,控制身体执行具体操作。而cpu相当于计算机的大脑,可以控制计算机系统执行各种操作。现在的计算机系统cpu已经可以是多核的了,就相当于是一个计算机有多个大脑。
  • 内存。计算机软件运行的时候会牵涉到一些数据存储和转换,这些数据都是保存在内存中的,没有内存的话,计算机软件就不能够运行。内存只有在软件程序运行的时候才会存在,程序关闭就没有内存了。
  • 磁盘。磁盘主要是持久化保存我们计算机系统的数据的,比如你从网站上下载了一本书,就会保存到磁盘上。这样我们下次重新开机的时候才不会消失。

首先需要明白的一件事情是,万物都是一直在发展的,都是在慢慢变好的,那么既然后续发展出了线程这个东西肯定是由于如果不给计算机引入线程的话会有一些问题,那这些问题是什么呢?

  1. 首先没有线程的话会导致cpu长期处于空闲状态,导致cpu利用率大大降低。比如没有线程的时候,我们的计算机系统处理任务的时候是串行按照顺序执行的,比如先提交给计算机系统的任务会先执行,并且在这个任务执行完毕之前下个任务不会执行。那比如我们现在顺序提交给了计算机系统两个任务,第一个任务是从磁盘中读取一个视频到内存里面;第二个任务是打开记事本;那么此时就会出现一个问题,就是我们的cpu会先去处理第一个读取视频的任务,读取视频的时候会进行i/o磁盘操作,会把磁盘中的视频读取到内存中,但是因为这个视频比较大,所以io操作的时间就会很长,但是问题就是,因为此时我们的计算机系统中没有线程,那么我们的cpu此时虽然是空闲状态,但是它也不能去调度其他的任务,只能被动等待。所以 如果没有线程 这就会让我们的cpu大部分时间都处于空闲等待的状态,大大降低了cpu的利用率。
  2. 会导致程序的响应速度变慢。比如还是上面的两个顺序任务,第一个任务是把视频从磁盘中加载到内存中,第二个任务是打开记事本。因为我们现在的计算机系统中没有线程,所以所有提交给计算机系统的任务都会顺序执行。所以在我们第一个任务执行完毕之前,第二个任务就不会执行,那么就会出现一种情况就是,我点击了一下打开记事本,但是计算机系统给我响应了好久才打开,因为它的上一个任务把视频加载到内存中还没有执行完。所以这就是计算机系统中没有线程的弊端,它会导致我们的程序的响应变得很慢。
  3. 会导致计算机系统处理任务的速度变慢。如果计算机系统没有引入线程的话,我们一段时间内只能把一个任务中的磁盘信息加载到内存中,比如我在把磁盘中的视频加载到内存中的时候,是不能加载磁盘中的其他东西到内存中的。但是如果有多个线程的话,cpu调度一个线程任务的时候比如说是把视频从磁盘中加载到内存中,然后这个流程就开始就行,但是cpu此时是处于空闲状态的,它可以继续去调度另外一个线程里面的任务,让他从磁盘中比如加载一本书到内存中。那么视频和书就可以同时加载到内存中了。我们计算机处理任务的速度就变快了。

进程和线程和程序三者的关系?
一个进程其实就是一个程序,一个进程里面或者说一个程序里面存在多个线程。
一个进程里面的多个线程共用进程里面的内存资源,所以多线程可能会出现共享资源问题。
线程是cpu调度的最小单位,我是这样理解的,cpu先去调度一个进程,然后给进程一个执行命令,这个时候进程再去调度里面的某个线程,用过这个线程去执行计算机里面的某个任务。

说完了计算机系统中没有线程的弊端之后,我们也就容易理解计算机系统中为什么会引入线程了,就是弊端的相反面嘛!

  • 减少cpu空闲时间,提高cpu利用率。比如我们cpu会先调度一个线程执行“把磁盘中的视频加载到内存”的任务,在这个任务进行io操作的时候,cpu不会再空闲等待了,而是继续去调度另外一个线程,执行打开记事本的任务。这样通过给计算机系统引入了多个线程 就能够大大减少cpu空闲时间,提高cpu利用率。
  • 提高程序的响应速度。如果没有引入线程,那么打开记事本的任务只能在第一个任务执行完毕再执行,那假如我们进行io磁盘交互的时间很长,就会出现一个问题,就是我打开记事本之后,过了很久才响应,过了很久才打开。
  • 提高计算机处理任务的速度。比如有两个任务,一个是“把磁盘中视频加载到内存中”,另外一个是“把磁盘中的音乐加载到内存中”,那么引入线程之后我们的加载音乐就不必再加载视频完毕之后执行了,我们二者可以在同一个时间段内执行,这就可以大大的提高计算机处理任务的速度。
  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 总结 2.11 练习 第3章 控制程序流程 3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符总结 3.2 执行控制 3.2.1 真和假 3.2.3 反复 3.2.6 中断和继续 3.2.7 切换 3.3 总结 3.4 练习 第4章 初始化和清除 4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 成员初始化 4.4.1 规定初始化 4.4.2 构建器初始化 4.5 数组初始化 4.5.1 多维数组 4.6 总结 4.7 练习 第5章 隐藏实施过程 5.1 包:库单元 5.1.1 创建独一无二的包名 5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的语法 6.2.1 初始化基础类 6.3 合成与继承的结合 6.3.1 确保正确的清除 6.3.2 名字的隐藏 6.4 到底选择合成还是继承 6.6 递增开发 6.7 上溯造型 6.7.1 何谓“上溯造型”? 6.8 final关键字 6.8.1 final数据 6.8.2 final方法 6.8.3 final类 6.8.4 final的注意事项 6.9 初始化和类装载 6.9.1 继承初始化 6.10 总结 6.11 练习 第7章 多形性 7.1 上溯造型 7.1.1 为什么要上溯造型 7.2 深入理解 7.2.1 方法调用的绑定 7.2.2 产生正确的行为 7.2.3 扩展性 7.3 覆盖与过载 7.4 抽象类和

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr-X~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值