00:00
好,前面呢,我们利用这个containerer原理,通过无配置文件的方式整合了spring l VC及定的功能,那接下来呢,我就来说一下三给我们来的一个要的特异步请理,那么在没有3.0之前,我们请求处理的方式就说request,也就说每一个请求进来,我们都会给你开一个线程来从头到来处理,那么他就应该是这个样子。我们发一个请求进来,他们看里边呢,会有一个线程池来进行处理请求,请求一进来呢,我们从线程池中拿到一个空闲的线程,帮他处理请求,请求处理我们在这调用业务逻辑等等,等调完我们都处理完以后呢,我们给他响应,响应结束以后,我们整个线程就得到释放,线程进入空闲状态,那就可以来接收下一个请求了,但是呢,我们这个线程池是有限的,如果没有异步处理的情况下,哎,我们请求一进来,如果说同时我们进来几百个请求,哎,那我们线程池呢,假设我们每一个线程都在处理请求,但是呢,我们不是异步处理,而我们这个业务逻辑要调很长的一段时间,那么当前没有空闲的线程了,下一个请求再要进来,我们主线程池里边没有再多空闲的线程了,那就没法得到处理了。
01:34
没法得到处理的本质原因就是我们这个主线程没有及时得到释放,没有更多的空闲线程来进行处理请求我们可以来看一下这个逻辑。我们来到3.0,那么假设呢,我们这儿有一个非常耗时的操作啊,我们叫say hello。这个耗时的操作呢,哎,我们需要执行很长时间,那么我们就来,哎睡一下,哎,Sleep我们来睡上三秒钟,那么如果是以前的方式呢,哎,我们来看,我在这要调这个c hello方法到我完成响应,那么我们就得等很长的时间,把这个异常看好,我们可以来打印一下都是哪一线程在工作。
02:23
好,这个thread,第2CURRENT thread,我们把当前线程打印一下,线程呢开始进行处理。就用这个方法处理,一直到它处理结束。包括呢,我们请求正在处理的过程中。我们这个。好,那么请求正在处理的过程中,那么我们可以来看一下。来访问我们这个hello请求。
03:02
来访问hello请求,那么要访问hello请求呢?我们就可以看到控制台的打印走。好,等上三秒呢,我们看到了这个hello控制台呢,我们看从始至终呢,都是由这个htp bio8081,我们这个四,哎,我们由我们这个线程开始结束以及处理请求,那么如果是这种方式,那就会带来我们之前说的那个问题,主线程呢得不到释放,那么下一个新的请求进来,就可能导致没法处理,那么异步请求又是怎么用呢?哎,我们也可以查询solid3.0规范,在3.0规范里边有一个request在这里边,这里边呢只示了咱们这个异步请求,这个异步请求呢,主要有这个异步的context的对象,我们这个异步的context的呢,它可以开始异步方法,以及呢主只要执行完了,我们通知我们这个Tom k这个请求执行完成,来达到我们这个处理结果,我们可以来使用一下。
04:10
我们来写一个新的来处理异步的方式,我们叫hello make。好,同样的,我们来继承HTTP。好,我呢用web来说,它要处理哪个请求好,我们就叫ay snc,好SYNC吧,SYNC就是这个异步请求,那接下来我们怎么处理呢?我还是来写它的do get方法。好,我们这儿呢,还是有一个很耗时的业务,我们放在这CTRLC。好放在这儿,但是呢,如果是以前的这种调用方法,那就不行了,我们接下来你要做的第一步,我们开启异步处理。
05:05
这一步处理怎么开启呢?首先我们这个必须说明支持一步,这有一个anthyic support啊,它默认呢是我们把它调成,我们点进去可以看默认是,那现在呢,把它调成那就可以支持一步了。然后呢,我们先来让他支持一步。然后呢,你再来开启异步模式,怎么开启异步模式呢?我们使用request对象,它呢有一个方法叫start,哎,Start anthic,把原生的request response传进来,或者直接调用它的这个方法都行,好我们让它开启异步模式,那么它会返回一个异步的contest的对象,好接下来呢,我们可以来看,在这个异步的contest对象里边,我们可以来设置一些东西,比如设置异步请求的这异步的监听器啊,包括呢,我们来主要来用它。
06:06
这呢有一个叫set out,我们可以说一下异步处理的超时时间啊,那么我们就不设它了,我们这有一个start start里边呢会传一个runable,诶我们呢就来简单的拗一个runnerable。Run里边的这个wrong,我们通过这个run呢,我们来调用我们的业务逻辑。好,那这样的情况下呢,我们把它手上的位置一下,好,那如果是这种情况,我们这个呢,就相当于进入了这个业务逻辑进行一步处理,那么这个一步处理完,我们要响应怎么办呢?哎,我们在这开始异步处理。这是开始异步处理,那如果我们处理完了,那我们就及时的说一下,哎,我们在这里边呢,如果我们调用完了,我们可以说一下我们这个异步已经调用完了,那调用完了,那我们要给它响应怎么办呢?还是一样request点,哎,Get anthic conest,获取到咱们这个异步的con对象,当然用前面的这个是一样的知识呢,我们也可以通过这种方式。
07:23
获取到异步的上下文。好,然后呢,我们通过它也可以来得到咱们这个响应,得到我们需要交出去的响应。我们来第四步获取响应,然后呢,我们还是利用这个响应。往出来写数据,Get right right。Hello,我们叫ay asy nc,好,那好,我们这种方式呢,那就是一个异步的方式,那我来启动来测试一下,好,我们在这儿重启一下。
08:09
啊,这个启动呢,有点报错,来看一下啊,这一块呢,是来说大致的来翻一翻,这有一个URL pattern有异常,说我们这个asy nc,好这个呢,我们注意加上斜杠啊好来重新来启动。重启动,重启动以后呢,我们来访问这个请求。访问从访问开始到我们看到那个响应结果,哎,时间呢是没什么变化的啊,我们也得这么长时间,毕竟业务逻辑还得三四秒才能运行完,但是注意我呢,在do开这开始我来打印,我来打印,打印什么呢?我们把它认为叫主线程,什么呢?我打印这是一个主线程,主线程是谁呢?
09:06
把这个线程呢,来打印一下获取,哎,我们这个当前线程我来打印一下,这是主线程开始。和咱们这个主线程结束。那么最后一步我来打印个主线程结束。但是如果我们要处理业务逻辑呢,我们是写在这个里边,那我在这我写一个负线程开始。傅先生。线程开始。还有呢,我们下边啊写完了,那我就负线程结束,包括呢,我们这个方法里边也打印了当前线程的这个处理,我们来看一下这都是有哪些线程处理的,并且是一个什么样子走。
10:00
好,启动完成。我们来访问回车。好,现在呢是看到结果,我们来看控制台,看控制台的时候呢,大家注意主线程开始,主线程结束,主线程在这打印的时候呢,这是立马开始跟结束,我们可以来打印一下他们的时间,主线程开始它的开始时间。加上吗?我们来获取一下咱们这个当前时间看,那其他的都一样,我们把这个当前时间我们都来大致的来看一看。这是副线程,好,这个也是副线程,这边是主线程,上边有一个主线程,好我们把这四个线程的时间我们都来打印,我重启一下,主要呢,观察这个时间。
11:04
好。我们来看控制台,我们看一下这主线程开始到主线程结束,很快基本上立马就结束了,而我们这个负线程开始,负线程开始到负线程结束,那它就耗了三秒多的时间,哎,我们明显可以看到,负线程呢,跟我们这个业务逻辑它用的是同一个线程,而主线程呢,在这啊用的是同一个线程,一开始就立马结束,所以呢,我们能看到的现象就是我们这个督盖的请求,主线程从这开始到下边呢,就会立即结束,那么我们线程就会得到释放,而副线程呢,它开始来处理业务逻辑,处理完了以后呢,给我们进行返回,这就是我们这个模型,那它就应该长得是这个样子,我们一个请求发过来,主线程呢会来接收请求来进行处理,这是我们弹开它线程池里边来分配一个线程来进行处理。当然未来。
12:08
处理迅速,期间我们这个线程呢,一处理,如果我们开启了异步模式,这个线程立马结束,那么这个线程就空闲了,接下来新的请求进来,可以继续来处理了,而我们的业务逻辑是来进行异步处理的,那就交给异步处理的线程池进行处理,只不过现在我们这个主线程用的线程池,你看啊,跟E,跟咱们这个异步处理的线程用的线程池都叫这个什么htv bio,所以说呢,它相当于并没有维护一个异步处理的个线程池,我们自己呢,可以去来维护一个异步处理的线程池,当然spring VC框架有来维护这个异步处理的线程值,我们就不用那么麻烦了,但是我们能看到的是他们看到的主线程立即返回,我们就来可以空闲来收新的请求了,这就是我们的这个异步处理,那当然我们下一刻呢,我们用spring mvc来使用一下。
13:08
这个异步处理的效果。
我来说两句