00:00
好,下边我们写个例子。哎,写个例子啊,让大家看一下我们为什么需要。Sovita异步处理。好,来个工程。这个是零六。异步处理。Are seeingness。啊,我们。零吧,这个是零。3.0,我不要外边的钱,不要直接finish。啊,咱们这样啊,咱们这样,我直接写一个solid。
01:04
我想想怎么写,嗯,写个。这个so,我就叫萨,诶点北京。To no点然后。Some so。这个就叫丧吧。都get。
02:03
那么下边啊,我们这样,下边我们我想一下啊。来吧,bo.set。Content type text。Itl恰S等于utf-八。啊,response.get。Writer。这是。Out。然后我们out.print。什么呢,这个。这是我一会儿要定一个子线程啊,这是主。
03:03
这主线程。是吧,主线程。开启。不要开启了。开始开始运行。对吧,这是主线程运行结束中间干嘛。中间我们要启动一个耗时的。运算过程,当然这个运算过程是个什么?是个线程,它是个子线程。我们现在有没有这个子验证,没有,没有我们就定义呗。
04:00
定义啊。Class。啊看class那电影什么咱们咱们电义那个接口的那个吧,运算的科e thread。Thread。然后我们让他。接口接口。接口是。啊。Re,就这吧,咱们不不不让他继承那个thread了啊,就这样,就用这个接口吧。哟,忘了他了啊。
05:01
这样做一个运算。这儿做一个运算,做一个什么运算,嗯。Four。这样咱们做十次运算,一从一到。十。这个。加加法啊。这可以吧,是吧。最后这就运算出萨姆这结果了,但这结果我还想让它显示到我们的。客户端浏览器怎么办呢?我我得给他个构造器,我得给他构造器啊。
06:04
找谁找他?我得把这个东西拿过来,Print writer。把它拿过来,这个叫什么,叫out?然后呢,我这儿给这个代餐构造器,就这out。见到我这里边是不是就可以使用这个out了。对不对,我这就可以out.print。萨萨,对不对,就可以这样了,诶。这忘了啊是吧。都给它加上吧,啊,我们这样这也加一个。这什么,这儿不是写的子线程开始运行吗?不是主线程这儿。
07:00
我们也给他写上一个,这是子线程。运行。跟那个区分一下啊,这个子线程。结束对吧,当然了,又忘了。都给它加上。这个也加上。好。这个意思清楚吧,这不我定一个计算,定义一个。
08:00
此线程进行。叫。耗时的。运算你注意啊,现在这个叫耗时,现在它耗时吗?现在不耗时,我们。也,哎,不对啊,这应该写到这儿,最后萨姆这个结果呀,是吧,我们让他这样耗时,真正让他耗时。让他运算一次。睡会儿。Sleep,睡多长时间,一秒钟。我们整体。这个。给它拆开写一下,这这看着就好看一些了啊好,那就这样OK了。
09:02
或者。坏了。什么情况?就这吧,就这。是吧?这是不是运算一次让他休息一秒钟啊?啊,这样啊,我再给控台输出个东西。输出我爱的值,输出爱的值。好,就这就我的子线程就定义完毕了。然后这边我要启动这个子线程,那你首先要定义是吧,定义这个线程。我另一个thread。
10:02
呃,这边new一个先写,一步一步写吧,你一个compute。Come。Putt thread这放一个out是吧,我这个叫。CT是吧?Computer thread吗?CT紧接着。我一个thread city。它返回值是是我们那个。子线程是吧。Thread。好。启动sub thread.start这是不是就启动了对吧。
11:06
OK了,现在这就OK了。他俩一启动这边就进行运算,好这个代码我们跑一下。啊,我们这个项目已经删掉了啊。好。这个呢,就这样,那会很难受,保存一下。我们保存一下。嗯。
12:04
So,现成池先存到这啊,给它关了。啊,我们看这。它不是运行了吗。好,我这要访问some solid,看好,看好,走。耶啊,我们这个叫萨是吧,不是萨啊,看好走。这是不是已经结束了,你这边你还在进行的。好,这边也结束了。
13:02
这这什么意思啊,这个什么意思啊。啊。现在这个意思是你注意。我这个主线程。开始了,紧接着一启动这个子线程,好了,子线程开始运算了,它已经启动了,紧接着他就执行它了呀。所以当前的这个萨。这个线程已经结束了,给用户响应了,当你看到他的时候,就已经给出用户响应了,也就是说当前这个so已经结束了。当前的这个solid主线程已经被释放了。它已经被释放了,但是子线程呢,仍然在运算。我们再访问一次,看着我一刷新。好了。
14:00
这这次啊,这个这个不能这样让他运行完,因为这又和上一次的弄一块儿了。我们得把它关了。得这样运行,要不然测试那个结果啊。那结果就和上一次的结果就混一块儿了。好看着再看好啊,我只要这里边出现了那个主线程结束就说明。我当前的主线程确实已经结束了,可是你看已经结束了,他已经结束了,但是子线程是不是还在运算。子信征并没有结束。哦,子线程没结束,可现在的问题不错,这种方式啊,它我们的当前并没有被占用,很快他就结束了,就释放了,可现在的问题是什么,你运算的结果客户端看不到啊。
15:15
你看这东西根本就没有。连这个也没有,他根本就看不到。你看不到你不错,你释放倒是挺快,可问题是你运算结果客户端看不到,那不就没用了吗?所以我们这个程序需要进一步改进一下,我得让他能看到,怎么样就能看到它了。为什么刚才看不到,是因为这个响应,我们主线程已经把这个响应给了客户端了。然后这个流就关了。这个流已经关了,你这个流已经关了,你他运算结束以后,又要把东西写到那流里边,还能写进去吗?
16:07
他写不进去啊。所以。现在的问题是什么?现在的问题是。这两个执行确确实实是异步了,这谁执行谁的,他们之间好像没关系。而我现在想让他。想让客户端看到这个结果,看到运算的结果就不能让他提前结束。那怎么办?不让他结束,让他等会儿呗,你不是开启了这个子县城了吗?睡会儿。睡会儿,睡多长时间,咱们这样,咱们让他睡。15秒可以吧,让他睡15秒,让主线程睡15秒。
17:06
你看现在这个程序会出现什么情况啊。这样把它给关了。免得他上一次结果会影响我们啊。好。我把控制台清一下。Some,看好了啊。走。你注意啊,这个不是404,你看这等待你看转圈呢,等着谁等着他呢。好这十秒了,他就等了15秒啊,他在主色,主色15秒OK了。你看主线程开始,主线程结束,中间是不是子线程的结果,是不是也看到了。
18:00
哎,不错,这结果看到了。子线程运行的结果看到了,但是你注意这个程序的问题很大。大到哪儿了,我们看到了呀,这个过程里边是不是这个页面一直在转圈转圈转圈它处于阻塞状态呀。用户体验非常不好,这是第一,第二他一定在转圈,转圈是干嘛呢?是执行谁的,是执行他呢,也就是说当前的这个斯。一直被占用着。没有被释放。那这个过程是什么?实际上是我们主线程和子线程实现了执行的同步,这叫同步。怎么了,他执行执行到这儿以后呢,要等着他,他执行完了,他才继续往后执行呢,这叫同步了。
19:04
这个虽然客户端能看到结果,可是用户体验非常不好。我们现在想要的是什么?想要的结果是?主线程。能够马上执行完毕。然后把。这个主线程,把这个的线程怎么样放回到线程池释放掉。然后呢,子线程运行的结果。还能够。响应给客户端。我们现在要的是这样的一种效果。那这时候就需要我们使用。异步处理了。
我来说两句