00:00
好,那咱们呢,在创建多线程之前呢,诶再来说个事儿,就是诶我们为什么要创建多线程啊,相当于使用多线程的优点是什么,以及呢?诶我们在何时需要用到多线程啊,也是需要大家做一个了解啊,首先叫使用多线程的优点啊,这块你看我有个背景说呢,以单核CPU为例,只是一个单核啊,单核CPU为例,如果只使用单个线程先后完成多个任务啊,肯定比用多个线程完成用的时间呢要更短,这个能理解吗?啊,稍微有点迷糊啊,是这个意思,你比如说哎大家看哈,我现在的话呢,啊,这个排都满了啊,比如我现在我这个C盘里边有一个G的文件,我现在呢,想把这个文件呢,复制到我们这个D盘当中,复制一份,同时的话呢,我这个E盘当中呢,有一个一个G的文件,我先把它呢复制到我们这个F盘当中。假设我现在电脑只有一个单核的CPU,只有一个核,那这个时候呢,你说呃,我这样复制两种不同的方式复制,你说哪个快哈,第一种呢,就是说我把这个呃先把这个C盘这个文件呢复制到这儿,这时候呢,它就先复制呢,哎这个呢先不要复制啊,等它这个复制完的时候呢,我马上呢把这个文件呢,诶复制到这这呢相当于两块时间加起来啊,你看这个时间跟我什么呢,我把这个呢往这复制,同时呢,我这个往这复制,你说哪个快。
01:27
差不多你说差不多,嗯,差不多的话呢,嗯,就是你要说只是出于这个CPU切换的影响的话,那个咱们就忽略到别的那些,呃,执行的那个线程啊,就单纯的就光说这个事,就是CPU这时候不干别的事儿,就干这个事儿啊,所以就没有差不多的说法了,那就是看到底是谁谁谁快谁慢了是吧,应该是第一个要。快一些。啊,为什么第二个反而慢了呢?嗯,因为你这时候一个CPU,你这时候呢,是不是有两个任务,你这块复制的同时,如果这个也复制,相当于至少是不是有两个线程啊,哎,对,这个时候的话呢,我们不管要做这个复制这个CPU呢,还需要快速的去切换,哎切换是不是也得花时间啊啊所以就会导致呢,你第二种这种方式呢,反而是慢了啊这呢就可能就打破我们的一个概念说诶明明不是说多线程要更快吗?怎么现在慢了呢?
02:26
哎,因为你现在这不是个单核了嘛,哎,但如果我们要是一个多核CPU的话呢,你这个复制的同时,这个也复制,你可能用不同的核了,这个时候呢,它又不用切换了,这个时候其实你看到的,诶,可能这个同时这样去复制反而就更快了,因为这是多核的CPU了。啊,当然这时候也不意味着我们原来是单核的时候呢,就不会去创建多线程。对吧,哎,你是单核的时候呢,虽然咱们看到说我用这种多线程,反而比这种这个这个呃,复制完以后再复制这个反而更慢了,但是我们也要用到多线程啊,为什么呢?呃,这就说明它还是有好处的。
03:03
啊,还是有好处的,有哪些好处呢?第一个它可以提高应用程序的一个响应,尤其呢是对于我们图形化界面呢,操作更有意义。啊,你像咱们用这个360啊,对这种图形化界面的这种操作呢,很多时候呢,我们需要就是同时要做多个事儿。嗯,你就大家如果说像以前那种DOS系统啊,咱们现在呢,执行这个指令啊,我再进行文本编辑,这时候你不要你你不用干别的事儿,那就一个线程就可以了,那现在有了这个图形化界面以后,哎,我希望呢,诶,我这时候呢,做这个体检啊,体检的同时呢,我想做的木马查杀啊,或者换句话说呢,我想这块体检的同时呢,我还想看点这个呃文章,我还想去浏览浏览这个网页,哎我还想听听音乐,就是对于图形化界面来讲的话呢,大家有更多的诉求了,所以这个时候呢,就需要你有多个线程。啊,当然了,你要是不同的应用程序,那还体现为多个进程啊,啊,所以能够提高用户的一个体验啊,当然了,随着现在这个CPU的这个主频越来越高啊,切换的这个速度,速度还在那啊,就切换速度,然后呢,执行的主频越来越高,其实这块呢,我们同时让他去执行多个任务,即使是单核的话呢,用户呢,感觉其实也还好啊,也还好,也像是在同时在做多个事儿。
04:18
哎,第二的话呢,我们可以提高CPU的一个利用率。啊,就是你这个CPU在这儿,我现在同时让他做好多事儿啊,他自己呢去快速切换,相当于呢,他这块不停的都在执行啊,你要是这块呢,让他去执行着,执行完以后,呃,第二个呢,你得马上跟上,呃,你要是没跟上的话,中间有一段间隔,现在这个CPU呢就空闲了,那同时我让他做好多事,这个CPU的利用率呢,当然也就更高了啊。然后第三个呢,是改善程序结构,将既长又复杂的进程,我们可以分成多个线程独立运行,利于理解和修改。啊,这个就有点像我们写一个项目一样啊,这个项目的话呢,咱们把不同的这个功能呢,分成不同的模块啊,就看的更清晰,嗯,这个代码也是一样,我们写这个程序的话呢,呃,我们要想做体检那就做体检,你想做木马查杀就做木马查杀,这是不同的事儿,那我就用不同的线程去体现这个代码结构呢,也更加的清晰,诶这是它的一个优点啊。
05:17
然后呢,我们在什么时候需要去哎创建多线程,这呢举了三种场景,第一种程序需要同时执行两个或多个任务。需要同时执行两个或多个任务,比如说咱们Java程序,一方面呢,我需要呢,起一个main方法对应的主线程序跑我们这个程序,同时呢,咱们Java程序呢,还是呃有自动的垃圾回收,你不能等我这个没方法都执行完以后呢再回收,那有可能这个过程当中的这个垃圾太多了,那内存有可能就溢出了,所以这个时候呢,我就希望呢,这个没方法对应的这个主线程在执行的同时呢,后台再跟进一个垃圾回收的线程。啊,这个时候一边执行啊,一边呢去回收这个垃圾啊,这个时候呢,就也就是说呢,我们有必要呢,去创建多个线程啊,有这样的一些诉求啊,当然了,你还以这个360这个为例,诶,我们就需要呢,用户啊,他既干这个啊又干这个啊,你就需要呢去写多线程,然后第二个说程序呢,需要实现一些需要等待的任务。
06:21
啊,比如说用户输入啊,文件读写啊,网络操作啊等等,这个时候呢,我们也需要用多线程。举个例子,大家呢都用手机,那我们就以手机为例了啊,手机呢,我们比如说大家快中午了,去点这个外卖啊,点外卖你打开美团外卖啊,或者是饿了么啊,打开以后啊,这里边呢,你会看到很多的这个呃,中午可以吃的这个东西,这呢通常这个位置都是放图片的啊,图片呢我们知道它比这个文本呢要大很多啊,那这个时候呢,大家这个拿这个手往上不停的去滑,往上滑的时候呢,你会发现往上一划这块呢,就出来一个叫item,就是一项啊,你再往上滑又出来一项,那这里边的每一项这个数据显示,其实都是需要一个线程帮你去加载。
07:05
啊,你这对应的可能是一个具体的一个文本框,这个文本框显示什么内容呢?我们需要拿到从后台从那个网络当中获取到这个数据呢,给你塞载进去啊,就显示出来了,相当于大家往上滑过程当中,其实是有一个线程在帮你把这个数据装出来的,这个能理解对吧?啊,那你在往上的过程当中,你会知道每一项这块是不是都有个图片呀。而这个图片的话呢,它相当于这个文本来讲,它比较大啊,那就会出现这样问题,如果说大家现在这个网比较差,我往上滑的过程当中,如果没有多线程,只有一个线程啊,那就意味着的话呢,我们往上滑的同时这个装图片下载图片的这个呃,功能是不是也得在你这个线程里边去做呀,那可能就会出现你往上一滑,这个时候呢,这个图片还没下完呢,但是你要又往上滑的时候呢,因为我这时候正在帮你下载图片,你是不是往上滑就滑不出来了,这时候你会感觉有点卡。是吧,因为我图片我现在正下图片呢,这时候你就不要往上滑,这不就卡到这儿了吗?啊,而事实上呢,大家划的时候呢,你会发现体验挺好,为什么呢?因为我们下载图片的这个功能,我是用专门的一个线程来做的啊,我往上一滑,就是你这个图片下载比较慢,或者说这个网比较差,你该下还下你的啊,我往上滑呢,呃,这个文本的这个数据呢,提前都已经一次性加载好了,我往上滑的时候呢,这些先给我装出来,图片呢,下载不出来,下载不出来呢,我就放个默认图片,或者说你正在下,那就你就先下着,所以大家你会看到你往上滑的过程当中,有的时候呢,这些图片都能完整显示出来,有的时候呢,没有显示出来,那是因为现在网可能比较差啊,你把它停一下,诶,突然它就出来了,是因为这个线程呢,恰好这个时候下载完了,那就帮你显示了。
08:47
啊,这是由多个线程来做的,这样的话呢,你在滑的过程当中啊,它就不会出现卡顿了啊,就是提高一下用户的这个体验,嗯,第三个呢,叫需要一些后台运行的程序啊,还是以咱们刚才说的那个Java程序,后台有一个垃圾回收的线程啊,有个异常处理的线程啊,这都属于这样的一个情况啊,基于刚才说的这样的一些点啊,我们说呢,实际开发当中,我们还是有必要来创建多个线程的啊,这是这样的一个情况。
我来说两句