01 线程简介
任务, 进程, 线程, 多线程
多任务
什么是多任务?
生活中的例子
第一个例子:
这张图片, 一个人边吃饭边玩手机, 同时做了两件任务,大家不要去当这样的低头族.
第二个例子:
第二张图, 开车的时候能打电话, 能打点滴
第三个例子:
第三个图, 说明了我们可以边上厕所, 边玩手机.
这些都是多任务的例子, 现实生活中这样的例子特别多,
看起来是多个任务在工作, 其实分析一下本质, 我们的大脑是不是在同一时间依旧只做了一件事情, 比如我们在吃饭, 有些人是不是吃着吃着在刷抖音, 有些人边吃着边追剧, 但是在同一瞬间的时候, 可能这一秒是在看手机 , 下一秒吃了一口饭, 你自己因为这个时间交替的很快同时做了两件任务. 分工合作,相当于真正的多核了, 但是我们的大脑是一件事情, 就是只能在一个时间只能做一件事情, 比如说我们锻炼双脑, 左手画圆右手画圈是不是非常难, 正常人的大脑以及一个时间做一件事情就已经很好了.
多线程
比如这是我们早期一个公路, 这个游戏叫暴力摩托, 蓝衣服这个人骑上去踹另一个人, 这个路非常的窄
然后如果有很多人去过这一条路就会引起很多争执, 反正各种各样的事情就出现了于是乎我们想解决是不是把路扩宽
就慢慢的加几条分割线, 一边进行, 另一边逆行,我们分了多条道, 然后去解决了这个小阻塞的问题
现在道路宽敞了, 车也就看不见了, 一边一辆哗哗就彪走了, 打架的问题就及小率存在了.
妈妈再也不用担心我在道路上被人踹了.
游戏例子:
比如我们在打游戏的时候, 有一个账号, 我们和女朋友一起用, 你想打她想打, 是不是都会不开心, 现在我们有两个账号了, 你用你的, 她用她的, 我们可以一块打了, 这就是多线程.
程序例子:
咱们程序里面有两个线程, 有一个主线程就是咱们的main函数, 假设它是在跑的, 我们现在需要一个东西同时跟着它走, 原来就非常麻烦了, 原来我们写的在中间调一个方法, 我们调完方法,方法执行完才能执行main函数, 我们想要两个方法同时走就需要到我们的多线程了. 我们要实现程序的高效率就会让它多条路同时执行, 因为现实生活中很多需要涉及到并发的操作.
普通方法调用和多线程
普通方法调用
这样的话效率低
多线程
这个效率就高了, 相当于一个人执行多个事情
在操作系统中运行的程序就是进程, 比如你的QQ, 播放器, 播放器, 游戏, IDE等等…
一个进程可以有多个线程, 如视频中同时听声音,看图像, 看弹幕, 等等
Process与Thread
Process(进程) Thread(线程)
🔹说起进程, 就不得不说下程序. 程序是指令和数据的有序集合, 其本身没有任何运行的含义, 是一个静态的概念.
🔹而进程则是执行程序的一次执行过程, 它是一个动态的概念. 是系统资源分配的单位
🔹通常在一个进程中可以包含若干个线程, 当然一个进程中至少有一个线程, 不然没有存在的意义. 线程是CPU调度和执行单位.
记住一个最简单的概念:
进程, 它是系统分配的, 系统分配给我, 我去开辟一个新的进程, 然后进程里面有线程, 真正执行的是我们的线程, 哪怕我们的进程什么都不干, 里面都会有个线程叫main线程, 就是我们的主线程, 进程跑的是我们的一个主线程, 我们Java里有一个线程叫gc线程, 垃圾回收器清理垃圾的. 最重要的核心就是我们的Thread(线程)
注意: 很多多线程是模拟出来的, 真正的多线程是指多个CPU, 即多核, 如服务器. 如果是模拟出来的多线程, 即在一个CPU的情况下, 在同一个时间点, CPU只能执行一个代码, 因为切换的很快, 所以就有同时执行的错局.
本章核心概念:
🔹线程就是独立的执行路径.
🔹再程序运行时, 即使没有自己创建线程, 后台也会有多个线程, 如主线程, gc线程;
🔹main() 称之为主线程, 为系统的入口, 用于执行整个程序;
🔹在一个进程中, 如果开辟了多个线程, 线程的运行又调度器(CPU)安排调度, 调度器是与操作系统紧密相关的, 先后顺序是不能人为的干预的.
🔹对同一份资源操作时, 会存在资源抢夺的问题, 需要加入并发控制;
🔹线程会带来额外的开销, 如CPU调度时间, 并发控制开销.
🔹每个线程在自己的工作内存交互, 内存控制不当会造成数据不一致.