单线程和多线程?
前言
最近在工作中遇到了一个问题,就是前端导入商品时,导入商品过多和解析图片过慢时会导致前端一直等待,有时候还会出现等待超时的情况,为了解决这个问题,当时将需要等待的代码块抽出来放到新线程中处理,主线程直接给前端返回成功信息。然后翻出之前看的Java并发编程的书,写下了这篇比较基础的文章
进程和线程
首先,我们介绍一下进程和线程
进程:进程是程序的一次执行过程
线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,一个线程只能属于一个进程。
单线程和多线程
其次,我们介绍一下单线程和多线程
单线程:单线程就是一个进程只有一个线程。程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。
多线程:多线程就是一个进程有多个线程。在程序执行时,所有线程会交替执行。后面的线程不用等待前面的线程处理完毕。
多线程根据并行和并发又有不同的情况。在并发时,多个线程会抢占cpu资源执行一块逻辑,没有抢到cpu资源的就会进入等待状态,等cpu空闲后继续抢占资源。这就像一个车间只有一台机器,所有的工人都有相同的任务,他们都要使用这台机器,抢到的工人就执行任务,没有抢到的工人就等待任务执行完毕后,继续抢这台机器。
在并行时,多个线程会同时执行一块代码逻辑。就像一个车间有四台机器,四个工人分别使用四台机器,同时执行任务,不用等待其它工人任务执行完毕。
使用场景
再其次,我们介绍一下单线程和多线程的使用场景,因为多线程不一定比单线程快,在很多时候,都是单线程会更快一点儿。
单线程:在需要串行化执行代码(不可分割)时,就不需要多线程了。比如一个代码块里面要往数据库插入三条数据,插入第二条数据时必须要等待第一条数据插入完成,插入第三条数据时必须要等待第二条数据插入完成。这种情况肯定是要使用单线程
多线程:多线程只有需要处理并发任务,或者需要长时间等待的任务时才更有上场的意义。比如下载时,需要一边下载一边展示进度条,这时就需要开辟两个线程去处理,否则下载完毕才执行进度条逻辑代码没有意义。
上下文切换
最后,说一下为什么执行串行化代码时单线程会比多线程更有效率
因为多线程在执行时会一直进行上下文切换,上下文切换会影响线程的执行速度,并且线程的创建也需要时间。
上下文切换:CPU通过时间片分配算法来循环执行线程任务,而循环执行即每个线程允许运行的时间后的切换,而这种循环的切换使各个程序从表面上看是同时进行的。而切换时会保存之前的线程任务状态,当切换到该线程任务的时候,会重新加载该线程的任务状态。而这个从保存到加载的过程称之为上下文切换。
比如我们拿了两本书,一本中英文词典,一本英文书,在读英文书时发现某个单词不认识,于是便打开中英文词典看单词的汉译,但是放下英文书之前,大脑必须记下这本书读到了多少页的多少行,等查询完单词之后,能够继续读这本书。但这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。
是春风, 是余晖, 是一道曙光, 是未来可期。点个赞吧!