00:00
那么这个异步处理如何实现呢?对于我们的主线程。需要做两步操作。我们拷贝一个代码。首先。需要给他添加一个属性,当然你要添加属性,这个属性就得给他个属性名了,对吧。天亮说哪个呢?
01:02
就这个。叫。呃,三。Supported。就是亦不知持他是个不而知我们复之为处。驾这入是吧。他表示,当前so。支持。异步处理,哎,这是第一个,第二个。我们要通过这个。请求你注意啊。我们要通过这个请求呢。
02:00
获取到一个异步上下文对象。当然。现在啊。咱们这样。我把这个就删掉了。我把这个删掉了啊,我们获取一个异步上下文。对象。通过请求获取这个请求,我们找到request。你看啊,Request里边有一个。Get。不是get。啊。叫start。S开头的。看这。就这个。Start。
03:00
这个。I。安散是吧,看着这个这个。方法啊是哪儿呢?是不是从3.0开始有的呀,这是。获取它是你看返回知识吗?返回值这个对象就是一个叫做异步上下文对象。它就是一个异步上下文。而我们。就获取这样一个对象。嗯,这个对象。这个对象。看着啊。这个我就不要了。这两个都不要了。这两个都不要了啊啊,这是获取异步异步上下文啊。
04:10
对象。异步上下文对象request点儿。Start。然后。我们这个叫什么异步上下文,我们就叫AC。这一步上下文对象是需要开,需要开启的啊,它是需要开启的,我们看一下。它里边有方法是大的,你看到没。Start。这start干嘛用的,我们看一下啊。Cause the container to dispatch a thread。的引起是吧,引发容器。
05:03
Dispatch a threat分配一个。县城。可能。From a managed thread来自于什么这个线程池?To run a specified reable,那它里边放的,你看放的是什么?Reable是一个reable对象,那正好我们这个reable是谁呀?他呀。CT是不是?所以。我们。开启。一步上下文对象AC点。Star。十大ACOK啦。
06:09
对吧,AC了错了啊CT啊CT。这个嘛是吧,OK了这两步。我们主线程完成这两步就可以了,现在我们就可以跑了,这程序就可以跑了啊,我们看一下。看好看好。好。嗯。我们看着控制台,看他的输出结果是什么。访问some。你看他怎么又在等待了,是不是你看?八九十。
07:02
Yeah。怎么回事?这,这还是在转圈呢。这怎么回事?是不是等待?等。等看有什么结果没有。坏了,这这这确实没啥结果呀。对不对,没东西,这怎么回事。我们刚刚啊,仅仅是对谁对我们的。进行修改,其实对这个re也是需要修改的,修改什么?你要通知。你注意你要通知当前的这个。子线程。执行完毕。通知当前的子线程执行完毕,那这这这不就已经执行完毕了吗?他这执行完了,紧接着执行,它这不已经执行完毕了吗。
08:07
不错。他执行完毕了。呃,可是我们说这个主线程现在有问题,他执行完毕以后,主线程不知道。也就是说,你得反过来通知他,执行完毕了,得通知他一声。那怎么通知呢?通过这个上下文。异步上下文,你需要把这个异步上下文对象传递给我们的。这个。这个紫县城。那怎么传递呢?肯定得通过参数啊,所以啊,我们在这儿看着我把它复制一份。给他搁这儿了。这是我们的一部上下文。
09:04
对象是吧。然后搁这儿了。这是不是就有参数了,通过参数是不是就给它数据化了,那现在这个AC就有了,哎呀坏了,AC有了,那这这这out没了呀,没关系没关系,看着啊我们找。找它里边,这不就是AC吗?是不是看它里边还有什么API。看看还有什么啊,诶,这有get request是不是,你看到没?You get request you get response。那你要想获取这个out,那不就简单了吗?所以啊,我们在这儿想要这个out,好说。
10:00
ac.get。放第二,Get writer。他是谁?他就是我们的out。他就是out。当然这有异常是吧?这儿有一常。干脆我们把这东西。统统给他放在这儿。然而,这异常呢?那当然了,这全部都给它放到拆开里边了啊。现在都到拆开里边了,OK了。这就OK了。OK,以后呢,怎么就通知,怎么就通知。我们的诶这这忘了啊,这那就得反过来是吧,把这AC放到这儿啊。
11:04
是不是这个子线程嘛,把这个上下文。给了这子线程作为参数出现。怎么就通知了呢,怎么就说你执行完毕了啊,我这个。叫叫叫什么?这是我们的主线程就知道了。这里边儿通过方法AC。点。有complete。ac.complete。它是干嘛的,它表示先不说表示什么,我们运行一下看看,看看效果了再说先运行。
12:02
看好。清了。我这边要执行什么。执行这个萨。又开始等待了,这又在等待。七八九十。Yeah。这次出来结果了,对不对,这一次出来结果了。那确实是通知了。对不对,这是干嘛的,实际上是通知。主线程。啊,这叫什么?这叫异步子线程。执行完毕,好,下边我们仔细看一下这个结果啊,仔细看一下这个结果,这个结果你仔细看看,和刚才我们没有使用异步的时候。
13:14
结果一样不一样。主线程开始运行,主线程执行结束。这下边儿是子县城的。好像刚才的那个。是什么结果了,这样咱们重新跑一下。不就是他吗,是不是?六。我们重新跑一下。上走。又是等待。
14:01
八九、十,11 12 13 14、15开。哎,是吧,你看看这个结果和这个结果一样不一样。他不样。主线程开始运行,主线程运行结束,这中间是不是子线程啊?这个呢,主线程已经开始,主线程经结束了,这是子线程,诶还就是不一样啊。这怎么回事儿?但是我们对于我们客户来说,如果不仔细看的话,我们的感觉啊,用户的体验都是什么等待。你知道这个等待相同的这个等待是个什么意思吗?这个等待就说明。说明我们的主线程我们的被阻塞了。
15:03
这种情况也是被阻塞的。但和第一个阻塞不一样的地方在哪儿?他是先把这些都执行完毕了。他把这些都执行完了,你看这都执行过了。对不对,这都执行过了,他在执行的同时。怎么样?这个也在执行,也就是说我们的萨和这个子线程,它的运行确确实实已经实现了什么异步了。如果不是一部,你不可能。先出现它,再出现它,这俩出现以后,后边又出现的这样的东西。后边出现的是子线上的东西,这肯定说明他我就不等着,不等着你执行完毕,我就先执行它了。
16:02
所以我们的主线程和子线程是什么?是异步执行的。说明这样一个问题,但即使主线程执行完毕了,我们的子线程还没结束。那么怎么办呢?主县城等待。主线程等待他等待,等待什么,等待哪个时机?你注意,他等待的其实并不是这个子线程执行完毕。不是我们写的这句话。他等待的是什么?或者说这句话是底层做了什么这句话。他底层做的工作实际上是。销毁了这个。异步对象。当我们的这个对象被销毁的时候。
17:04
那么。它会将我们的out标准输出流信息写入到。浏览器,浏览器就可以看到了,所以他一直等待的时机是什么?等待的时机是。要把这个这个这个这个。异步上下文对象销毁。所以啊,我们在在这儿加了这样一句话。加了这样一句话,我们可以实现刚才这种目的,你注意啊,我们现在这程序啊,先说完成了什么,完成了异步的运行,主先生和子先生之间异步的运行是完成了,但是我们的效果却又是什么效果是同步的效果,就是我们这个阻塞了它,它仍然是被阻塞了。
18:00
先不说啊,为什么被阻塞,这个一会儿来分析,我们下面来说什么呢?我们下边来说这个能够完成,能够完成能够将它销毁的。其他方式还有什么?还有哎,我们来看啊,嗯,来看我我我想想怎么写这样吧,这个给大家留着吧。就留着他啊。虽然后边的改动并不大。
19:00
这个。我把他删了,这个我就删掉了啊,这我删掉它删掉咱们这样。这个我也删了啊。我重新运行它。坏了,我把那个关了啊,现在。零八哎。3404了。这次可是真的是这个404啊。
20:01
这真的是他404,嗯,这个没问题是吧。这个没问题。好。Solid。嗯,这也没问题啊,好,重新。重新重新运行一下啊。Some。看他为什么会404呢?Some。这404可是不对呀。
21:00
呃,这这资源就找不到。我们这个是sum,确实是some啊。确实是Sam。我再看看啊。再看七。怎么回事呢?嗯,七没问题是吧,那估计是咱们拷贝这个八的时候出点问题。七没问题,咱们这样。哎,你看到没。
22:01
我我删这个吧了吗?没有我没删他他他他自己就没了啊哼。这个这个有问题,咱们这样把它删掉。就是把。先看启动,启动没问题啊。你看这没问题啊,刚才那个肯定是拷贝的时候出问题了。
23:07
好。现在我们改代码。把它删掉。现在把它删掉重新运行,把它删掉重新运行啊。等待啊。
24:07
你知道我在等待,等待什么吗?我这会儿心里面一直在数着数。一直在数这个数,什么数?哎,其实我一直在数,数到30。为什么呢?看着。在这儿。这个啊,这个你看看,看看这个是干嘛的啊。咱们刚才不是用它了吗?啊,完成这是异步操作,That was start on the quest that was usedto,初始化这个,然后关闭什么response,它关闭了标准输入流。也就是说我们这个操作啊,Complete操作。他关闭了标准输出流,然后呢,结束了我们的异步操作。
25:06
这里边儿,这里边儿我们看这个东西,大家看这。Set timeout设置超时,这是个什么超时?Set timeout是毫秒是吧?For this。这个异步上下文对象这儿有个超时,一旦说超时了。你设置的超时了,他会干嘛?Timeout applies to this这个一旦。这个这个这个初始化什么。啊。啊,我们这这这这里边儿这一段啊,我们没有我们想要的那个结果,也那那个那个解释,我们不管它了,我们看一下超时,我给设一下超时啊。
26:06
这是第二个。第二种方式啊,第二种方式,这超时你注意需要在。需要在它开启之前就上下文开启之前设置超时,所以我在这啊设置异步上下文对象的超时实现。ac.set timeout,我设置段三秒。这是三秒,你看会出现什么情况啊?这可没有东西。啊。来。Start。
27:02
好。Sum。三。看到没这儿你再看这这儿还在运行。哎,这这这这又是什么意思啊?但这次好像没看到这个运行的结果,不错,没看到那个运行的结果。但是呢,但是到了三秒以后,直接还显示了主先生结束了。对不对,主线结束,紧接着运行了一步子线程运行。这紧接着后边就没了,这又是什么意思呢?这个超时时限一旦到了,他做的工作和刚才那个complete做的工作是一模一样的。其实。
28:00
是什么?当然了,也不能说一模一样,它是异步,我们这个异步子线程没有结束,但什么结束了,他将这个out,这个response。对象。快对象,Response对象都给你销毁了。包括异步上下班对象也销毁了。也就是说他一销毁马上做到什么,赶快给响应,可是你现在给他响应,等我这个子线程运行完毕的时候发现。发现我写里边的东西是不是白写了呀,因为。Response对象已经没了。对不对,我们先不管那个东西啊,先不管他看到的什么情况,用户体验是什么,用户看到的结果是什么,我们现在来说的是能够能够实现什么,能够实现将这个异步对象给。将异步操作结束。
29:00
的方式有几种,刚才这里边演示了一种,通过AC点什么complete这儿呢又演示了一个。设置超时时限对不对。然后呢?然后我们还有。还有一种方式,你也可以。这种方式啊,我们看着。嗯,我拷贝他。零九。三。这个删掉啊。这个删掉,然后我们打开。
30:02
Thread。这里边儿我不用它了。用谁呢?看着API里边啊,看那API里边有个叫。Dispatch的方法。Dispatch。他干嘛的?Patches the request and response object of这个东西to pass就是把你的这个异步。异步操作啊,相关的异步对象,相关的request response怎么了,转发给你这里边儿这个东西。那咱们这样。第二。Dispatch。转化到哪,比如说我这啊,假设假设我这有个秀点JSP,我给他整到这。
31:05
我给他转到这儿。看好。当然我秀点JSP现在没有是吧?啊,我们得建一个啊,嗯,JSP。瘦点J。求PE。配件啊。好了。三灶。六七八九十。
32:00
结束。看到没?这是是什么意思,其实这个这个dispatch的意思啊,Dispa的意思,它相当于我们。以前学过的。Get requestpatch里面那个。Include。它会将这个里边内容包含到。标准输出流里边一块。一块儿都给了,一块儿放到里边儿。然后。显示给。客户端浏览器,但不管什么啊,我们现在总结一下。中间呢,就中间点儿吧。总结到这儿啊。这样吧,咱们找到主线程。
33:04
找到主线程。把这个就去掉了啊。对于。异步上下文对象的。啊啊啊啊啊啊。结束方式。总结有我们常见的有几种方式。有三种。第一,在异步线程,异步子线程吧,使用什么异步上下文对象AC是吧。
34:00
AC点。方法。那这个方法。用于结束。异步操作,所有的异步操作他都结束了。结束异步操作。并将什么东西啊,并将。与当前异步对象相关的request与response对象。销毁,你注意,这个对象就没了。这第一第二。在异步子线程中使用AC点什么D4。
35:10
方法。该方法。该方法。也是是吧。啊,该方法可以结束,他顺带着结束了,可以结束异步操作。并这样这样写不好。该方法在结束异步操作的同时,会将。参数说。呃,指定的。页面内容包含到哪儿啊?当前异步对象。
36:07
当前异步对象,异步对象就是指的那个异步上下文对象啊,当前异步对象相关的标准输出六种。其执行效果相当于什么?相当于?Request第pat对象的include方法的。执行。下午。哎,这是第二,第三是什么。在异步。
37:01
不是的,异步是异步S组线程中怎么设置?AC的超时超超超超时实现。当。超时实现。到达时需要注意啊,当超时视线到达时,那么异步。对象。销毁。义务对象及其相关的请求与响应。响。Request与response对象销毁,来这我们总结一下啊,这些都可以结束。
38:11
我们的一部。操作。
我来说两句