单线程和多线程?

前言

最近在工作中遇到了一个问题,就是前端导入商品时,导入商品过多和解析图片过慢时会导致前端一直等待,有时候还会出现等待超时的情况,为了解决这个问题,当时将需要等待的代码块抽出来放到新线程中处理,主线程直接给前端返回成功信息。然后翻出之前看的Java并发编程的书,写下了这篇比较基础的文章

 

进程和线程

首先,我们介绍一下进程和线程

 

进程:进程是程序的一次执行过程

线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,一个线程只能属于一个进程。

 

 

单线程和多线程

其次,我们介绍一下单线程和多线程

 

单线程单线程就是一个进程只有一个线程。程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。

多线程多线程就是一个进程有多个线程。在程序执行时,所有线程会交替执行。后面的线程不用等待前面的线程处理完毕。

多线程根据并行和并发又有不同的情况。在并发时,多个线程会抢占cpu资源执行一块逻辑,没有抢到cpu资源的就会进入等待状态,等cpu空闲后继续抢占资源。这就像一个车间只有一台机器,所有的工人都有相同的任务,他们都要使用这台机器,抢到的工人就执行任务,没有抢到的工人就等待任务执行完毕后,继续抢这台机器。

在并行时,多个线程会同时执行一块代码逻辑。就像一个车间有四台机器,四个工人分别使用四台机器,同时执行任务,不用等待其它工人任务执行完毕。

 

使用场景

再其次,我们介绍一下单线程和多线程的使用场景,因为多线程不一定比单线程快,在很多时候,都是单线程会更快一点儿。

 

单线程:在需要串行化执行代码(不可分割)时,就不需要多线程了。比如一个代码块里面要往数据库插入三条数据,插入第二条数据时必须要等待第一条数据插入完成,插入第三条数据时必须要等待第二条数据插入完成。这种情况肯定是要使用单线程

多线程:多线程只有需要处理并发任务,或者需要长时间等待的任务时才更有上场的意义。比如下载时,需要一边下载一边展示进度条,这时就需要开辟两个线程去处理,否则下载完毕才执行进度条逻辑代码没有意义。

 

 

上下文切换

最后,说一下为什么执行串行化代码时单线程会比多线程更有效率

因为多线程在执行时会一直进行上下文切换,上下文切换会影响线程的执行速度,并且线程的创建也需要时间。

 

上下文切换:CPU通过时间片分配算法来循环执行线程任务,而循环执行即每个线程允许运行的时间后的切换,而这种循环的切换使各个程序从表面上看是同时进行的。而切换时会保存之前的线程任务状态,当切换到该线程任务的时候,会重新加载该线程的任务状态。而这个从保存到加载的过程称之为上下文切换。

比如我们拿了两本书,一本中英文词典,一本英文书,在读英文书时发现某个单词不认识,于是便打开中英文词典看单词的汉译,但是放下英文书之前,大脑必须记下这本书读到了多少页的多少行,等查询完单词之后,能够继续读这本书。但这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。

 

 

是春风, 是余晖, 是一道曙光, 是未来可期。点个赞吧!

 

posted @ 2021-07-15 18:48  博客小屋  阅读(1984)  评论(0编辑  收藏  举报