00:00
好,前面呢,我们说了一下线程池,那在我们以后的业务系统里边,凡是我们所有的一步任务,我们都应该交给线程池来处理,而不是我们自己来new一个thread.start这样呢很容易导致我们服务器的资源耗尽,那交给线程池处理呢,也有非常多的好处,比如我们说它可以来降低我们资源的消耗,因为我们线程池里边已经创建好了一些线程,就在这儿等待来接受任务,那新的任务进来,我们会重复利用我们以前创建好的这些线程,这些线程呢有些也不会销毁,所以我们呢,避免了频繁的创建和销毁线程带来的这个性能损耗,那如果我们避免了这些损耗的话,我们肯定也提高了我们这个响应速度,不是像以前只要任务一进来,我们直接创建线程,完了以后再来销毁,那光这个创建和销毁时间肯定都浪费了一大堆,所以呢,我们从这一方面来说提高了响应速度。第二方面,假设我。
01:00
我们是以前我们所有的线程都来同时运行,我们线程池不控,假设呢,我们这有1000个线程,我们1000个线程呢同时运行,我们是这么运行的,我们以单核CPU为例,大家都知道看起来1000个线程同时执行CPU呢,其实是要转到它的时间片它才会执行,所以呢,如果当前他在执行,那其他人其实是CPU没转到在这儿等待着呢,然后呢,CPU转到别人了,那他就不能执行了,但是由于CPU转的很快,我们看起来是同时执行,但是我们都知道CPU来回的切换我们这个线程执行,而且还要恢复线场,整个过程呢,是非常耗费性能和资源的,但是如果有了我们线程池,我们线程池里边呢,现在控住最多只有200个,那么这个CPU就算要进行时间片切换,只进行这200个的现场恢复和时间片切换,那他肯定又要节省很多的时间。所以呢,从这方面也能提高我们的速度。
02:01
包括它能提高我们线程的可管理性,那举一个例子,如果以前没有我们的线程池,我们都是直接任务来启动,我们系统资源耗尽,我们一点办法都没,而现在我们呢,全部把它们放到线程池里边,比如我们在我们整个业务代码里边,我们抽取了两个线程池,一个呢是核心业务的线程池,那所有的重要的一步任务都放在它里边,一个呢是非核心业务的线程池,比如一些简单的不太重要的,我们发验证码啦,发邮件通知啦等等,我们把它呢交给非核心业务限制池,那假设如果我们这个线上应用运行起来,它的这个内存吃紧了,我们想要给它释放一点空间,那我们呢,就可以把非核心业务线程池整个呢直接关掉,因为我们线程池里边提供了对所有线程的操作方法,我们可以关闭某个线程,关闭我们这个线程池,所以呢,我们可以直接将线程池杀到了,那就。
03:02
给我们会又释放很多的资源,那等需要的时候呢,我们再来把它开启,这相当于就对我们管理线程提供了一定的可能性,所以呢,我们以后就直接来使用线程池来运行异步任务,那我们这个异步任务的运行,我们现在已经用线程池得到了解决,但是呢,我们现在还有一个需要解决的复杂业务场景,比如我们现在呢,多个异步任务,比如ABC这三个异步任务,它呢运行的时候还不是大家都能同时运行,他们还有一定的关系,比如C必须等待A的返回结果以后,它要用A的结果,然后呢,他自己还要异步运行,但是呢,B又不用等,A和CB可以先去异步运行,当我们这个异步任务产生一些关系和顺序以后,我们要编排好它们的关系来进行一个调用,又是一个比较复杂的过程,所以呢,接下来我们就可以使用compli future。
04:02
来解决我们这个问题,特别针对于我们这个业务场景,我们可以来看一下,那接下来呢,会来做一个商品详情页的查询,比如我们来对比京东,我们这个在这检索到商品以后,我们想要看某个商品的详情,我们都是来点进来,点进来呢,商品详情页的内容非常多,比如有商品的一些基本信息,它的标题、价格等等基本信息,还有商品的图片、组合、套餐,以及我们的商品介绍以及规格包装,那这些呢都是详情页要展示的,所以呢,我们一个商品的详情获取可能要这么多的内容,首先第一个获取我们SQ的基本信息,那就是页面的标题等等这些内容,然后下来第二个获取squ的图片信息,那就是这一块的内容,接下来第三个我们获取SKU的促销信息,那就是我们这一块的内容,比如我们当前商品有没有什么优惠信息,然后呢,我们还要获取S。
05:02
Q,所有的销售属性,那就是这一块内容们点进某一个商品以后,虽然只是选中了这个SK组合,那它的其他SKU组合我们还想要看,那我们就要获取这一块的组合内容,包括。我们还要获取商品的规格参数以及商品的详情,那就是对应的我们整个详情页的这一块内容,那们商品的介绍详情,以及我们的规格参数详情,那这些内容呢,如果按照以前我们先不用异步的方式,假设每个都花费这么多的时间,那我们一个做完,一个做光,我们获取某一个商品的详情信息,那我们可能呢,就得花费这两个呢,是一秒,两秒,三秒,四秒,这是1.5,那就是5.5秒,那我们呢,相当于我们至少要花费5.5秒的时间,我们才能看到我们整个商品的详情信息,这样肯定是不合理的,所以如果我们使用异步的方式,大家都来同时来进行检索查询,那我们只需要等待一个最长的耗时,那就大概在1.5秒以后,我们就能看到我们的响应,所以呢,我们在这一块肯定需要异步,但光需要异步还不行。我发现。
06:17
那这几个操作啊,它都是有逻辑的,首先SKU基本信息的获取,以及SKU图片,SKU促销这些我们可以同时执行,他们没关系,各自获取过自的,他们查的表都不一样,而且呢,SQ的促销信息还得查我们的远程的优惠系统,这个肯定更慢,但是大家注意,我们想要获取PU所有的销售属性。这个就有关系了,因为我们想要查哪个商品的详情,我们肯定带的只是当前SQ的ID,我们要查这个详情,那查这个详情呢,我们带着SQID,把这三个先能异步他们都查到,但是S所有的销售属性,我们得先等到第一步把SQ的基本信息拿到以后,那们才能知道当前SQ对应哪个s puu,那知道它对应哪个SQ了,才能查出它的销售属性信息,所以呢,四还依赖一的结果,而我们这个五呢,那就更依赖我们一的结果了,我们想要获取这些参数都得知道po的ID,所以呢,456都需要一返回以后才能查,而456之间呢,又没关系,大家都可以并发执行,所以呢,他们之间的关系关联还是稍微比较复杂的,那我么要做这么一个异步,要把它按顺序的编排运行起来,那么使用compible future就非常合适了。这是我们这。
07:42
AK1.8以后给我们添加的一个功能,我们可以来搜一下,我来CRC,好,我们来到我们这我CRLN,我们来找一下我们的compliable future,这个compliable future呢,我们可以看一下,它是我们这个类,它来实现了我们这个future接口,那这个future接口呢,我们点进来看一下,我们以前用过这个crh,我们以前呢,给大家说cable的时候,我们用过一个叫future task,我们用它封装了我们的C包的内容,我们这个future task呢,我们可以点进来看,它呢其实就是一个future,我们说future最大的特点就是可以获取到我们的异步结果。
08:21
我们在这来批注一下,好,那么这一块呢,Future可以来获取到我们的异步结果,Future可以获取到异步结果。所以呢,我们整个compli future我们都能获取到所有异步任务的结果,它里边呢也提供了非常多的方法,我CTRL f12,大概呢给大家看一下我们的这个compliable future,就类似于大家在以前学习5U的时候,我们给大家讲了一个叫promise,它来异步编排我们的所有Ajax请求,一个执行完了,点Z干什么,点Z干什么,点Z干什么,那么complete of future呢,也是这么来做的,但是大家来看一下我们的这些所有方法里边,他们呢设计的一个最大特点,我来随便点进来一个,我们看到呢,他基本上都喜欢接收我们这些东西,来点进来一个,这就是我们的一些函数式接口,所以呢,Compli future要整个使用,大家要对拉姆达表达式要用的比较熟悉,那这样呢,我们就可以简化很多的语法细节。
09:29
那我们下节课呢,就测试使用comp future来完成我们的异步任务,并把它们按照顺序来编排起来。
我来说两句